自承载 Self-Host ASP.NET Web API 1 (C#)

本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。

创建控制台应用程序项目

启动 Visual Studio,然后从“开始”页中选择“新建项目”。 或者,从“ 文件 ”菜单中选择“ 新建 ”,然后选择“ 项目”。

在“ 模板 ”窗格中,选择“ 已安装的模板 ”,然后展开 “Visual C# ”节点。 在 “Visual C#”下,选择“ Windows”。 在项目模板列表中,选择“ 控制台应用程序”。 将项目命名为“SelfHost”,然后单击“ 确定”。
在这里插入图片描述

(Visual Studio 2010) 设置目标框架

如果使用 Visual Studio 2010,请将目标框架更改为 .NET Framework 4.0。 (默认情况下,项目模板以 .Net Framework 客户端配置文件为目标)

在“解决方案资源管理器”中,右键单击项目并选择“属性”。 在“目标框架”下拉列表中,将目标框架更改为 .NET Framework 4.0。 当系统提示应用更改时,单击“ 是”。
在这里插入图片描述

安装 NuGet 包管理器

NuGet 包管理器是将 Web API 程序集添加到 non-ASP.NET 项目的最简单方法。

若要检查是否安装了 NuGet 包管理器,请单击 Visual Studio 中的“工具”菜单。 如果看到名为 NuGet 包管理器的菜单项,则表示具有 NuGet 包管理器。

安装 NuGet 包管理器:

  1. 启动 Visual Studio。
  2. 在“工具”菜单上,选择“扩展和更新”。
  3. 在“扩展和汇报”对话框中,选择“联机”。
  4. 如果未看到“NuGet 包管理器”,请在搜索框中键入“nuget 包管理器”。
  5. 选择 NuGet 包管理器,然后单击“ 下载”。
  6. 下载完成后,系统会提示安装。
  7. 安装完成后,系统可能会提示重启 Visual Studio。

在这里插入图片描述

添加 Web API NuGet 包

安装 NuGet 包管理器后,将 Web API Self-Host包添加到项目中。

从“ 工具 ”菜单中,选择“ NuGet 包管理器”。 注意:如果未看到此菜单项,请确保正确安装 NuGet 包管理器。

  1. 选择“管理解决方案的 NuGet 包”
  2. 在 “管理 NugGet 包 ”对话框中,选择“ 联机”。
  3. 在搜索框中,键入“Microsoft.AspNet.WebApi.SelfHost”。
  4. 选择 ASP.NET Web API自主机包,然后单击“安装”。
  5. 安装包后,单击“ 关闭 ”关闭对话框。

备注:请确保安装名为 Microsoft.AspNet.WebApi.SelfHost 的包,而不是 AspNetWebApi.SelfHost。

在这里插入图片描述

创建模型和控制器

本教程使用与入门教程相同的模型和控制器类。

添加名为 Product的公共类。

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

添加名为 ProductsController的公共类。 从 System.Web.Http.ApiController 派生此类。

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

有关此控制器中的代码的详细信息,请参阅入门教程。 此控制器定义三个 GET 操作:

URI说明
/api/products获取所有产品的列表。
/api/products/id按 ID 获取产品。
/api/products/?category=category按类别获取产品列表。

托管 Web API

打开文件 Program.cs 并添加以下 using 语句:

using System.Web.Http;
using System.Web.Http.SelfHost;

将以下代码添加到 Program 类。

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

从客户端应用程序调用 Web API (C#)

让我们编写一个调用 Web API 的简单控制台应用程序。

向解决方案添加新的控制台应用程序项目:

  • 在“解决方案资源管理器”中,右键单击解决方案,然后选择“添加新项目”。

  • 创建名为“ClientApp”的新控制台应用程序。
    在这里插入图片描述
    使用 NuGet 包管理器添加 ASP.NET Web API核心库包:

  • 从“工具”菜单中,选择“ NuGet 包管理器”。

  • 选择“管理解决方案的 NuGet 包”

  • 在 “管理 NuGet 包 ”对话框中,选择“ 联机”。

  • 在搜索框中,键入“Microsoft.AspNet.WebApi.Client”。

  • 选择“Microsoft ASP.NET Web API客户端库”包,然后单击“安装”。

  • 在 ClientApp 中向 SelfHost 项目添加引用:

在“解决方案资源管理器”中,右键单击“ClientApp”项目。

  • 选择“添加引用”。
  • 在 “引用管理器 ”对话框的“ 解决方案”下,选择“ 项目”。
  • 选择 SelfHost 项目。
  • 单击" 确定"。
    在这里插入图片描述
    打开 Client/Program.cs 文件。 添加以下 using 语句:
using System.Net.Http;

添加静态 HttpClient 实例:

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

添加以下方法以列出所有产品、按 ID 列出产品以及按类别列出产品。

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

其中每种方法都遵循相同的模式:

  1. 调用 HttpClient.GetAsync 将 GET 请求发送到相应的 URI。
  2. 调用 HttpResponseMessage.EnsureSuccessStatusCode。 如果 HTTP 响应状态为错误代码,此方法将引发异常。
  3. 调用 ReadAsAsync 以从 HTTP 响应反序列化 CLR 类型。 此方法是在 System.Net.Http.HttpContentExtensions 中定义的扩展方法。
    GetAsync 和 ReadAsAsync 方法都是异步的。 它们返回表示异步操作的 Task 对象。 获取 Result 属性会阻止线程,直到操作完成。

有关使用 HttpClient 的详细信息,包括如何进行非阻止调用,请参阅 从 .NET 客户端调用 Web API。

在调用这些方法之前,请将 HttpClient 实例上的 BaseAddress 属性设置为“http://localhost:8080”。 例如:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

这应输出以下内容。 (请记得先运行 SelfHost 应用程序。)

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

在这里插入图片描述
官网参考:https://learn.microsoft.com/zh-cn/aspnet/web-api/overview/older-versions/self-host-a-web-api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Photoshop 中扩展背景

展示一些在 Photoshop 中扩展背景的简单有效的方法 1. 如何在 Photoshop 中扩展具有纯色背景的图像 步骤 1 让我们从打开第一张图片开始。点击 Control-O 并选择图片。 步骤 2 要在 Photoshop 中扩展具有纯色背景的图像的背景&#xff0c;您需要做的就是按 Alt-Control-C 并…

ubuntu安装到vmware

文章目录 最新ubuntu下载地址安装流程之创建虚拟机显示界面成功创建虚拟机安装流程之虚拟机中安装ubuntu 最新ubuntu下载地址 点击此处下载ubuntu 安装流程之创建虚拟机 显示界面成功创建虚拟机 安装流程之虚拟机中安装ubuntu 安装说明:采用ubuntu server版安装,版本号为ubu…

Spark与HBase的集成与数据访问

Apache Spark和Apache HBase分别是大数据处理和分布式NoSQL数据库领域的两个重要工具。在本文中&#xff0c;将深入探讨如何在Spark中集成HBase&#xff0c;并演示如何通过Spark访问和操作HBase中的数据。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark…

商城小程序(7.加入购物车)

目录 一、配置vuex二、创建购物车的store模块三、在商品详情页中使用store模块四、实现购加入购物车功能五、动态统计购物车中商品的总数量六、持久化存储购物车的商品七、优化商品详情页的total侦听器八、动态为tabBar页面设置数据徽标九、将设置tabBar徽标的代码抽离为mixins…

软件测试概念及分类整理汇总

前言 测试小伙伴在谈论软件测试分类&#xff0c;五花八门的分类&#xff0c;眼花缭乱。因为将各个维度划分的内容都整到一块了&#xff0c;在加上各自不同的见解与补充&#xff0c;各种冲突...... Findyou我经过多年测试总结基本定为4类测试(最多5类&#xff0c;自动化或者兼容…

Contingency Planning学习记录

Contingency Planning over Probabilistic Hybrid Obstacle Predictions for Autonomous Road Vehicles Contingency Planning over Probabilistic Hybrid Obstacle Predictions for Autonomous Road Vehicles - 知乎 Contingency Planning over Probabilistic Hybrid Obstac…

Java多线程并发篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、如何停止一个正在运行的线程二、notify()和notifyAll()有什么区别?三、sleep()和wait() 有什么区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…

MaxKey 单点登录认证系统——开发环境部署

开发指南 | MaxKey单点登录认证系统 修改配置文件 application-maxkey.properties、application-maxkey-mgt.properties 配置nacos配置数据库 开发环境启动 1)MaxKey统一认证系统 maxkey-webs/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyApplication.java 2)Max…

美餐支付 - PHP代碼实现

前言 背景 前段时间&#xff0c;因接手的项目需要实现 美餐支付 的功能对接 在此记录一下鄙人的实现步骤&#xff0c;方便有需要的道友参考借鉴 场景描述 我们的 “现代膳食” 售卖机&#xff0c;可以在屏幕上显示可配送的餐食 用户选中商品后&#xff0c;点击购买 选择 “美餐…

Jmeter 性能压测 —— 常遇问题与解决技巧!

问题1&#xff1a;如何在大并发测试下&#xff0c;让登录或者后续接口只执行一次&#xff1f; 分析&#xff1a; 这个问题网上的答案其实很多&#xff0c;但是大多不靠谱。 比如推荐使用仅一次控制器&#xff0c;但是仅一次控制器对线程组无效&#xff1b; 比如推荐跨线程组…

Sectigo的DV通配符https

Sectigo是近些年发展比较快速的CA认证机构&#xff0c;为了提升审核效率&#xff0c;在全国成立了审核机构&#xff0c;亚太审核中心的成立加快了Sectigo旗下的https证书的审核速度。Sectigo的https证书可以为网站安全提供有力支持&#xff0c;从而保护网站信息安全。今天就随S…

【REST2SQL】05 GO 操作 达梦 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 信创要求用国产数据库&#xff0c;刚好有项目用的达梦&#xff0c;研究一下go如何操作达梦数据库 1 准备工作 1.1 安…

02. Eureka、Nacos注册中心及负载均衡原理

01小节中订单服务远程调用用户服务案例实现了跨服务请求&#xff0c;在微服务中一个服务可能是集群部署的&#xff0c;也就是一个服务有多个实例&#xff0c;但是我们在调用服务时需要指定具体的服务实例才能调用该服务&#xff0c;在集群模式下&#xff0c;服务地址应该写哪个…

redis 从0到1完整学习 (十六):内存回收之 key 过期处理策略

文章目录 1. 引言2. redis 源码下载3. redisDb 结构体4. Redis 过期 key 的处理策略4.1 惰性删除 (Lazy Expiration)4.2 定期删除 (Active Expire / Periodic Expiration)* 5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff…

2024年如何使用WordPress构建克隆Udemy市场

您想创建像 Udemy 这样的学习管理 (LMS) 网站吗&#xff1f;最好的学习管理系统工具LifterLMS将帮助您制作像Udemy市场这样的 LMS 网站。 目录 Udemy市场是什么&#xff1f; 创建 Udemy 克隆所需的几项强制性技术&#xff1a; 步骤 1) 注册您的域名 步骤 2) 获取虚拟主…

JHipster - Spring Boot 的快速开发利器

产品介绍&#xff1a; JHipster是一个开源的、全面的应用程序生成器&#xff0c;它能够帮助开发者快速生成Spring Boot Angular/React/Vue.js的完整应用程序。它不仅提供了一个简单的界面来定义应用程序的配置&#xff0c;还提供了一组强大的代码生成器&#xff0c;可以在数分…

Taro+vue3 实现电影切换列表

1.需求 我们在做类似于猫眼电影的小程序或者H5 的时候 我们会做到那种 左右滑动的电影列表&#xff0c;这种列表一般带有电影场次 2.效果 3.说明 这种效果在淘票票 猫眼电影上 都有的 &#xff0c;一般电影类型的H5 或者小程序 这个是都有的 第一是好看 第二是客观性比较好 …

Python 工具 | conda 基本命令

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要了解 Python 的工具的 conda 相关的基本命令。Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。在Windows下&#xff0c;需要安装…

杨中科 ASP.NET Core 中的依赖注入的使用

ASP.NET CORE中服务注入的地方 1、在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builderServices中注入 2、在Controller中可以通过构造方法注入服 务。 3、演示 新建一个calculator类 注入 新建TestC…

使用 PHP-FFMpeg 操作视频/音频文件

做音频合成的时候找到的一个php操作ffmpeg 的类库。GitHub地址&#xff1a;https://github.com/PHP-FFMpeg/PHP-FFMpeg/。本文的例子大部分都是上面的 在使用之前请安装好 FFMpeg 。如何安装&#xff1f;请看 FFmpeg 安装教程。 使用composer快速安装 > composer require …