webapi框架搭建-建立项目(三)-webapi owin

webapi框架搭建系列博客

上一篇:建立项目(二)
  在上一篇里,咱们已经建立好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用。

owin介绍

  传统的asp.net网站只能部署在iis下,缺点是网站应用和服务器(即iis)耦合,这样便致使一个简单的请求在最终到达咱们本身写的业务代码以前还要通过一系列iis自带的各类modules和handlers及其它的机制(asp.net request pipeline),在个人开发经验中就常常遇到各类iis的问题致使一个简单的请求访问失败的状况。
  如今的owin规范能够很好的解决这个问题,对owin的介绍和了解请参考:owin官网( http://owin.org/)和微软对owin规范的实现( https://docs.microsoft.com/zh-cn/aspnet/aspnet/overview/owin-and-katana/
 

以iis为宿主

步骤
引入Microsoft.Owin.Host.SystemWeb
  这个包的目的是将到达iis的请求转发到owin管道
此包只有一个程序集:Microsoft.Owin.Host.SystemWeb.dll
此包依赖于:Microsoft.Owin和Owin包
 
建立Startup.cs文件
代码以下
using Microsoft.Owin;
using Owin;
using System.Threading.Tasks;
// 标识webapiOwin.Startup类为owin的启动类,也可写在AssemblyInfo.cs文件里
[assembly: OwinStartup(typeof(webapi.Owin.Startup))]

namespace webapi.Owin
{
    public class Startup
    {
        /// <summary>
        /// owin的http请求管道配置函数
        /// </summary>
        /// <param name="app"></param>
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            app.Run(context =>
            {
                context.Response.Write("这个owin管道");
                return Task.FromResult(0);
            });
        }
    }
}

  编译后测试接口地址:http://localhost:101/api/testhtml

  如上图结果,和”建立项目(二)“中的请求地址是同样的:http://localhost:101/api/test,但返回的结果却不是TestController.Get方法里的,证实request请求并无通过webapi,而是进入到owin的管道。
 
补充:
  若是将网站目录bin下的Microsoft.Owin.Host.SystemWeb.dll删除,一样访问接口地址:http://localhost:101/api/test,返回的是webapi接口里的处理的结果(和建立项目(二)同样),由此可得出结论:Microsoft.Owin.Host.SystemWeb.dll会将拦截到的iis里的请求转到owin管道,若是没有了此dll,请求会照旧用asp.net pipeline。
 
总结:
  一、引用Microsoft.Owin.dll和Owin.dll程序集,编写owin的Startup类。
    在Startup类的Configuration函数里写owin 的middlewares
  二、引用Microsoft.Owin.Host.SystemWeb.dll
  三、完成
    iis接收到的请求怎么最终进入到了咱们的owin middlewares里,彻底交给Microsoft.Owin.Host.SystemWeb.dll去处理了。
 

owin自宿主

  owin的四大结构为Host,Server,Middleware,Application。用自宿主的方式可彻底抛开iis。web

步骤
建立console应用
 
引用Microsoft.Owin.SelfHost包
 
注意会安装其它的依赖包,Microsoft.Owin.Hosting,Owin,Microsoft.Owin.Diagnostics,Microsoft.Owin.Host.HttpListener,Microsoft.Owin
 
编写控制台代码
using Microsoft.Owin.Hosting;
using System;

namespace MyOwinSelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            // WebApp.Start<Startup>和WebApp.Start均可以用,建议用后者,这样通用性强。OwinHost.exe就是用这种方法
            // 区别为:
            // 如用WebApp.Start<Startup>则要引用Startup类所在的项目
            // 如用WebApp.Start,则生成的控制台程序的当前目录下要有含[assembly: OwinStartup(xxx)]才能正常运行
            //using (WebApp.Start<Startup>("http://localhost:12345"))
            using (WebApp.Start("http://localhost:12345"))
            {
                Console.ReadLine();
            }
        }
    }
}

  

运行api

  一、将编译的控制台程序(MyOwinSelfHost.exe) 放入到网站的bin目录下,注意要将控制台程序里的相关dll文件也拷贝到webapi项目里
  二、双击MyOwinSelfHost.exe,运行控制台程序(此时控制台程序里什么都没有,也不会自动退出的,图就不上了)
  三、用postman返回接口接口地址:http://localhost:123456/api/test (注意,如今已经不是iis里的网站地址了,彻底是由控制台程序“新建”的一个“网站”),结果以下
  固然,若是不想本身写宿主,也能够用微软已经写好的owinhost.exe,请参考另外一篇博客owinhost.exe用法
 
  上面两个标题的内容讲的是如何用owin技术,固然owin技术的四大结构的细节没有讲,个人重点是梳理owin技术是如何和iis及自宿主(selfhost)交互,而owin里的其它技术细节会在后面的专题里介绍。能够看到,咱们用iis宿主和自宿主(selfhost)都已经实现了一个接口类网站应用的雏形(但访问的接口地址没有进入webapi 的action里),下面介绍webapi如何和owin技术结合。
 

owin和webapi

参考官方文档:服务器

步骤app

引入 Microsoft.AspNet.WebApi.OwinSelfHost
 
  注意:Microsoft.AspNet.WebApi.OwinSelfHost包里自己没有含任何dll的,nuget里只是提供了一个快捷引入webapi和owin所需全部包的快捷方式。本质上是要引用Microsoft.Owin.Hosting包,Microsoft.Owin.Host.HttpListener包,Microsoft.AspNet.WebApi.Owin包。不要被“OwinSelfHost"的名字所误导。
 
在owin里加入webapi middleware
Startup.cs代码以下
 public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            app.UseWebApi(WebApiConfig.OwinWebApiConfiguration(new HttpConfiguration()));
        }

 

WebApiConfig以下,只要看OwinWebApiConfiguration方法里的就行框架

using System.Web.Http;

namespace webapi.Configs
{
    /// <summary>
    /// webapi 配置类
    /// </summary>
    public static class WebApiConfig
    {
        /// <summary>
        /// 作为委托提供给System.Web.Http.GlobalConfiguration.Configuration()
        /// 用于webapi以iis为服务器的状况
        /// </summary>
        /// <param name="config"></param>
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            // Web API 路由
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
        /// <summary>
        /// 返回webapi的httpconfiguration配置
        /// 用于webapi应用于owin技术时使用
        /// </summary>
        /// <returns></returns>
        public static HttpConfiguration OwinWebApiConfiguration(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();//开启属性路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            return config;
        }
    }
}

运行asp.net

   编译后,无论是以iis宿主的方式仍是以自宿主的方法托管webapi网站,都能访问TestController.cs的Get()接口方法,结果以下:
一、部署在iis下
postman访问接口地址 (get方法):http://localhost:101/api/test
postman测试的返回结果:"this is TestController.Get()"
二、双击”MyOwinSelfHost.exe“,部署webapi应用
postman访问接口地址 (get方法):http://localhost:123456/api/test
postman测试的返回结果:"this is TestController.Get()"
相关文章
相关标签/搜索