使用VS2013可以直接创建web api,然后承载到IIS中就可以供外部访问。但这样必须依赖于IIS,如果采用OWIN,则不再依赖,仅仅是运行了一个执行程序而已。先来看看效果图。
具体步骤如下
1.新建一个空的web项目,然后使用nuget搜索安装Microsoft.AspNet.WebApi.OwinSelfHost.具体可以参见该文http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api。
2.构建提供访问的控制器
创建ValuesParamController,注意一定要Controller作为后缀的控制器类。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace WebApiOwin { public class ValuesParamController : ApiController { /// <summary> /// 获取产品 /// </summary> /// <param name="productId">产品ID</param> /// <returns></returns> public String TestProduct(Guid productId) { return productId.ToString(); } /// <summary> /// 获取产品 /// </summary> /// <param name="productId">产品ID</param> /// <returns></returns> public Product GetProduct(Guid productId) { if (productId == null) { throw new Exception("缺少产品ID"); } Product product = new Product(); product.Id = productId.ToString(); product.Name = "TEST"; return product; } } public class Product { #region 属性 private String _id; /// <summary> /// 唯一标识 /// </summary> public String Id { get { return _id; } set { _id = value; } } private String _name = String.Empty; /// <summary> /// 名称 /// </summary> public String Name { get { return _name; } set { _name = value; } } #endregion } }3.启动类
using Owin; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace WebApiOwin { public class Startup { public void Configuration(IAppBuilder appBuilder) { // Configure Web API for self-host. //HttpConfiguration config = new HttpConfiguration(); //默认的模板配置,这种配置方式只能提供http://localhost:9000/api/valuesparam的访问方式, //该无法定位到函数的访问方式即http://localhost:9000/api/valuesparam/getproduct //config.Routes.MapHttpRoute( // name: "DefaultApi", // routeTemplate: "api/{controller}/{id}", // defaults: new { id = RouteParameter.Optional } //); //appBuilder.UseWebApi(config); HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}",//其中action指的就是方法名,这种方式可以直接按http://localhost:9000/api/valuesparam/getproduct的方式访问 defaults: new { id = RouteParameter.Optional }//Optional表明routeTemplate中的id是可选的 ); appBuilder.UseWebApi(config); } } }
注:MapHttpRote的配置方式可以参照VS创建web api默认创建的路由配置方式来配置,参见下图
using Microsoft.Owin.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace WebApiOwin { class Program { static void Main(string[] args) { // Start OWIN host var server = WebApp.Start<Startup>(url: "http://localhost:9000/"); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Web API listening at http://localhost:9000/"); // 程序直接访问web api HttpClient client = new HttpClient(); var response = client.GetAsync("http://localhost:9000/api/ValuesParam/TestProduct?productId={BDCB861C-7266-4D10-BBC1-4FDD83AF58BE}").Result; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(response.Content.ReadAsStringAsync().Result); response = client.GetAsync("http://localhost:9000/api/ValuesParam/getproduct?productId={BDCB861C-7266-4D10-BBC1-4FDD83AF58BE}").Result; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(response.Content.ReadAsStringAsync().Result); Console.ReadLine(); } } }注:ValuesParam是控制器类名去掉Controller的名称,getproduct是函数名,问号后面的是参数及数值,productId是参数名,等号后边的是参数的值。
转载请注明出处