前言

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html

Asp.Net Web API可以需要IIS。你可以在你自己的主机上来承载一个Web API。

本教程来展示在控制台应用程序中来承载一个Web API。使用的开发工具为VS2013。

本文示例代码下载链接http://pan.baidu.com/s/1d56zf

创建一个控制台应用程序

这里我默认的Framework版本为4.5的。然后通过Nuget来下载安装Microsoft.AspNet.WebApi.SelfHost。

创建Model和Controller

首先添加一个public公共类Product。

  1. public class Product
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public string Category { get; set; }
  6. public decimal Price { get; set; }
  7. }

然后添加一个public公共类ProductsController,并且这个类继承自System.Web.Http.ApiController。记得添加扩展引用System.Web.Http

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Web.Http;
  8.  
  9. namespace SelfHost
  10. {
  11. public class ProductsController:ApiController
  12. {
  13. Product[] products = new Product[]
  14. {
  15. new Product { Id = , Name = "Tomato Soup", Category = "Groceries", Price = },
  16. new Product { Id = , Name = "Yo-yo", Category = "Toys", Price = 3.75M },
  17. new Product { Id = , Name = "Hammer", Category = "Hardware", Price = 16.99M }
  18. };
  19. public IEnumerable<Product> GetAllProducts()
  20. {
  21. return products;
  22. }
  23. public Product GetProductById(int id)
  24. {
  25. var product = products.FirstOrDefault((p) => p.Id == id);
  26. if (product == null)
  27. {
  28. throw new HttpResponseException(HttpStatusCode.NotFound);
  29. }
  30. return product;
  31. }
  32. public IEnumerable<Product> GetProductsByCategory(string category)
  33. {
  34. return products.Where(p => string.Equals(p.Category, category,
  35. StringComparison.OrdinalIgnoreCase));
  36. }
  37. }
  38. }

这个控制器定义了三个Get方法:

承载Web API

打开Program.cs,然后添加如下使用语句:

  1. using System.Web.Http;
  2. using System.Web.Http.SelfHost;

当然如果你没有引用,还是先要添加引用的(另外还有System.Net.Http)。然后添加如下代码到Program.cs里:

  1. var config = new HttpSelfHostConfiguration("http://localhost:8080");
  2.  
  3. config.Routes.MapHttpRoute(
  4. "API Default", "api/{controller}/{id}",
  5. new { id = RouteParameter.Optional });
  6.  
  7. using (HttpSelfHostServer server = new HttpSelfHostServer(config))
  8. {
  9. server.OpenAsync().Wait();
  10. Console.WriteLine("Press Enter to quit.");
  11. Console.ReadLine();
  12. }

现在你可以运行控制台程序了。

现在可以通过URI来简单测试Web API的正确性。

(可选的)添加一个HTTP URL命名空间保留(没遇到这个问题,暂未测试)

这个应用程序侦听到"http://localhost:8080"。在默认情况下,侦听一个特殊的HTTP URL是需要管理员权限的。当你运行上面的控制台应用程序的时候,你可能会得到这样的一个错误:"HTTP could not register URL http://+:8080",这儿有两种方式去避免这个错误:

  1.以管理员身份运行Visual Studio。

  2.使用Netsh.exe给与你的账号权限去保留这个URL。

若要使用Netsh.exe,以管理员身份打开命令提示框,并键入以下命令:

  1. netsh http add urlacl url=http://+:8080/ user=machine\username

其中machine\username是您的用户帐户。

当你使用完自托管的时候,最好是确定删除这个保留的URL。

  1. netsh http delete urlacl url=http://+:8080/

通过客户端应用程序来调用Web API

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

添加一个控制台应用程序,并命名为"ClientApp"。

同样的通过Nuget来添加Microsoft.AspNet.WebApi.Client。

当然还需要应用SelfHost这个项目。

打开ClientApp项目的Program.cs文件,添加如下using语句

  1. using System.Net.Http;

添加一个静态的HttpClient实例:

  1. namespace ClientApp
  2. {
  3. class Program
  4. {
  5. static HttpClient client = new HttpClient();
  6. static void Main(string[] args)
  7. {
  8. }
  9. }
  10. }

添加三个方法 获得所有产品列表信息,通过ID获得指定产品信息,通过目录获得产品列表信息。

  1. static void ListAllProducts()
  2. {
  3. HttpResponseMessage resp = client.GetAsync("api/products").Result;
  4. resp.EnsureSuccessStatusCode();
  5.  
  6. var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
  7. foreach (var p in products)
  8. {
  9. Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
  10. }
  11. }
  12.  
  13. static void ListProduct(int id)
  14. {
  15. var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
  16. resp.EnsureSuccessStatusCode();
  17.  
  18. var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
  19. Console.WriteLine("ID {0}: {1}", id, product.Name);
  20. }
  21.  
  22. static void ListProducts(string category)
  23. {
  24. Console.WriteLine("Products in '{0}':", category);
  25.  
  26. string query = string.Format("api/products?category={0}", category);
  27.  
  28. var resp = client.GetAsync(query).Result;
  29. resp.EnsureSuccessStatusCode();
  30.  
  31. var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
  32. foreach (var product in products)
  33. {
  34. Console.WriteLine(product.Name);
  35. }
  36. }

每个方法遵循相同的模式:

  1.调用HttpClient.GetAsync来发送一个HTTP Get请求到适当的URI。

  2.调用HttpResponseMessage.EnsureSuccessStatusCode ,如果HTTP响应状态是一个错误码,那么这个方法将抛出一个异常。

  3.调用ReadAsAsync<T> 反序列化一个来自HTTP响应的CLR类型。 这个方法是一个扩展方法,被定义在System.Net.Http.HttpContentExtensions


GetAsync 和ReadAsAsync 这两个方法都是异步方法。它们通过返回Task 对象来代表异步操作。获取Result属性阻止线程,直到操作完成。

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

  1. static void Main(string[] args)
  2. {
  3. client.BaseAddress = new Uri("http://localhost:8080");
  4.  
  5. ListAllProducts();
  6. ListProduct();
  7. ListProducts("toys");
  8.  
  9. Console.WriteLine("Press Enter to quit.");
  10. Console.ReadLine();
  11. }

接下来,进行测试。设置启动项目。

预测输出内容,应该会输出以下内容:

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

运行程序,查看结果

总结

感觉还是比较简单的吧,就这样一步一步的下来还是没什么阻碍的。

本文的参考链接http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api

本文已同步到Web API系列导航 http://www.cnblogs.com/aehyok/p/3446289.html

本文示例代码下载链接http://pan.baidu.com/s/1d56zf

Asp.Net Web API 2第九课——自承载Web API的更多相关文章

  1. 【ASP.NET Web API教程】2.4 创建Web API的帮助页面

    原文:[ASP.NET Web API教程]2.4 创建Web API的帮助页面 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 ...

  2. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs第2章 创建各种Web API 本文引自:http://www.asp. ...

  3. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)

    HTTP is not just for serving up web pages. It's also a powerful platform for building APIs that expo ...

  4. [转]【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)

    本文转自:https://www.cnblogs.com/inday/p/6288707.html HTTP is not just for serving up web pages. It’s al ...

  5. 【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 Creating a Help Page for a Web API2.4 创建W ...

  6. ASP.NET Web API 2系列(一):初识Web API及手动搭建基本框架

    1.导言 随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数.全栈工程师的压力越来越大. PC端,pad端,移动端App(安卓/IOS)的发展,使得前后端一体的开发模式十分笨重.因此,前后端 ...

  7. 《ASP.NET SignalR系列》第一课 认识SignalR

    从现在开始相关文章请到: http://lko2o.com/moon 一.概述 ASP.NET signalr对ASP.NET开发者来说是一个新的程序库,它能让我们更加容易便捷地开发实时通信功能; s ...

  8. 《ASP.NET SignalR系列》第二课 SignalR的使用说明

    从现在开始相关文章请到: http://lko2o.com/moon 接续上一篇:<ASP.NET SignalR系列>第一课 认识SignalR (还没有看的话,建议您先看看) 一.指定 ...

  9. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。

    前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...

随机推荐

  1. tomcat7.0 处理问题

    修改tomcat的用户密码 打开tomcat的conf/tomcat-users.xml 将<user username="admin" password="123 ...

  2. PHP性能优化简述

    先谢慕课网,这里只做理论简述/** * PHP性能优化 * * 1.问题分析 * PHP语法使用不正确 * PHP不擅长的事 * PHP连接的服务不给力 * PHP自身短板 * 其它原因 * 2.PH ...

  3. Log4j 配置 的webAppRootKey参数问题

    为了让Web项目中的Spring 使用Log4j做如下配置: 1.在web.xml中添加如下内容: <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的&q ...

  4. Allegro转换PADS终极篇(转载)

    Allegro转换PADS终极篇.....http://www.eda365.com/forum.php?mod=viewthread&tid=86947&fromuid=190625 ...

  5. Style file: generic.xaml

    All silverlight control style should be designed in generic.xaml which is in theme folder. But when ...

  6. scala 学习:object 和class, trait

    object: Scala中没有静态修饰符,static,在object下的成员全部都是静态的,如果在类中声明了与该类相同的名字的object则该object是该类的"半生对象", ...

  7. 把表里的数据转换为insert 语句

    当表里面有数据时,怎么把表里的数据转换为insert 语句 (从别人那里看来的用SQLServer 2008 R2测试可用) CREATE PROC spGenInsertSQL @TableName ...

  8. WordPress主机

  9. MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  10. Linux2

    linux开源软件 :apache软件 nginx支持更高的并发访问 MySQL PHP samba mongoDB python 应用领域: 一:服务器  二:嵌入式