托管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();
}
(可选)添加HTTP URL命名空间预留
这个应用程序监听http://localhost:8080/。默认情况下,侦听特定HTTP地址需要管理员权限。因此,当您运行本教程时,您可能会收到此错误:“HTTP无法注册URL http:// +:8080 /”有两种方法可以避免此错误:
1.使用提升的管理员权限运行Visual Studio,或
2. 使用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核心库包:在Manage NuGet Packages对话框中,选择Online。在搜索框中,键入“Microsoft.AspNet.WebApi.Client”。选择Microsoft ASP.NET Web API客户端库包,然后单击“ 安装”。
在ClientApp中向SelfHost项目添加引用:在解决方案资源管理器中,右键单击ClientApp项目。选择添加引用。在Reference Manager对话框的解决方案下,选择Projects。选择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.