基于OWIN的WEB API承载

使用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默认创建的路由配置方式来配置,参见下图


4.宿主程序

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是参数名,等号后边的是参数的值。

转载请注明出处

原文地址:https://www.cnblogs.com/sparkleDai/p/7604951.html