作者:Mike Wasson
本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。
新应用程序应使用 OWIN 自承载 Web API。
请参阅
使用 OWIN Self-Host ASP.NET Web API 2
。
本教程中使用的软件版本
Web API 1
Visual Studio 2012
创建控制台应用程序项目
启动 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 包管理器:
启动 Visual Studio。
在“工具”菜单上,选择“扩展和更新”
。
在
“扩展和汇报
”对话框中,选择“
联机
”。
如果未看到“NuGet 包管理器”,请在搜索框中键入“nuget 包管理器”。
选择 NuGet 包管理器,然后单击“
下载
”。
下载完成后,系统会提示安装。
安装完成后,系统可能会提示重启 Visual Studio。
添加 Web API NuGet 包
安装 NuGet 包管理器后,将 Web API Self-Host包添加到项目中。
从“
工具
”菜单中,选择“
NuGet 包管理器
”。
注意
:如果未看到此菜单项,请确保正确安装 NuGet 包管理器。
选择
“管理解决方案的 NuGet 包
”
在
“管理 NugGet 包
”对话框中,选择“
联机
”。
在搜索框中,键入“Microsoft.AspNet.WebApi.SelfHost”。
选择 ASP.NET Web API自主机包,然后单击“
安装
”。
安装包后,单击“
关闭
”关闭对话框。
请确保安装名为 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 操作:
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();
(可选) 添加 HTTP URL 命名空间预留
此应用程序侦 http://localhost:8080/
听 。 默认情况下,侦听特定 HTTP 地址需要管理员权限。 因此,运行本教程时,可能会收到此错误:“HTTP 无法注册 URL http://+:8080/"有两种方法可以避免此错误:
使用提升的管理员权限运行 Visual Studio,或者
使用 Netsh.exe 为帐户授予保留 URL 的权限。
若要使用Netsh.exe,请使用管理员权限打开命令提示符,然后输入以下命令:以下命令:
netsh http add urlacl url=http://+:8080/ user=machine\username
其中 machine\username 是你的用户帐户。
完成自承载后,请务必删除预留:
netsh http delete urlacl url=http://+:8080/
从客户端应用程序调用 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);
其中每种方法都遵循相同的模式:
调用 HttpClient.GetAsync 将 GET 请求发送到相应的 URI。
调用 HttpResponseMessage.EnsureSuccessStatusCode。 如果 HTTP 响应状态为错误代码,此方法将引发异常。
调用 ReadAsAsync<T> 以从 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.