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/test

  如上图结果,和”创建项目(二)“中的请求地址是一样的: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。
 
总结:
  1、引用Microsoft.Owin.dll和Owin.dll程序集,编写owin的Startup类。
    在Startup类的Configuration函数里写owin 的middlewares
  2、引用Microsoft.Owin.Host.SystemWeb.dll
  3、完成
    iis接收到的请求怎么最终进入到了我们的owin middlewares里,完全交给Microsoft.Owin.Host.SystemWeb.dll去处理了。
 

owin自宿主

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

步骤
创建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();
}
}
}
}

  

运行

  1、将编译的控制台程序(MyOwinSelfHost.exe)放入到网站的bin目录下,注意要将控制台程序里的相关dll文件也拷贝到webapi项目里
  2、双击MyOwinSelfHost.exe,运行控制台程序(此时控制台程序里什么都没有,也不会自动退出的,图就不上了)
  3、用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

参考官方文档:

步骤

引入 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;
}
}
}

运行

   编译后,不管是以iis宿主的方式还是以自宿主的方法托管webapi网站,都能访问TestController.cs的Get()接口方法,结果如下:
1、部署在iis下
postman访问接口地址 (get方法):http://localhost:101/api/test
postman测试的返回结果:"this is TestController.Get()"
2、双击”MyOwinSelfHost.exe“,部署webapi应用
postman访问接口地址 (get方法):http://localhost:123456/api/test
postman测试的返回结果:"this is TestController.Get()"
 
 

webapi框架搭建-创建项目(三)-webapi owin的更多相关文章

  1. webapi框架搭建-创建项目(二)-以iis为部署环境的配置

    上篇:webapi快速框架搭建-创建项目(一) 在"创建项目(一)"这一篇里已经创建了一个空的项目,但项目上什么都没有,本篇描述如何将webapi配置成部署在iis上. 步骤 用n ...

  2. webapi框架搭建-创建项目(一)

    本文只是一些基本的vs操作,供初学者参考,有基础的请查看 创建项目(二) 创建项目(三) 前言 为了从头了解webapi的技术,创建一个为空的项目 步骤 我用的是vs2017,从文件-->新建- ...

  3. webapi框架搭建系列博客

    webapi框架搭建系列博客 webapi框架搭建-创建项目(一) webapi框架搭建-创建项目(二)-以iis为部署环境的配置 webapi框架搭建-创建项目(三)-webapi owin web ...

  4. webapi框架搭建-安全机制(三)-简单的基于角色的权限控制

    webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...

  5. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

  6. webapi框架搭建-日志管理log4net

    前言 本篇讲怎么在前几篇已经创建好的项目里加上日志处理机制,我们采用Log4net技术.跟多的log4net技术的细节请查阅log4net的官网. log4net官网:http://logging.a ...

  7. webapi框架搭建-webapi异常处理

    webapi框架搭建系列博客 前言 上一篇我们已经完成了项目的日志管理,在项目开发中日志会经常记录程序中的异常,供后续问题排查使用.本篇讲如何在webapi里加入异常处理机制. 目的和原则 1.程序任 ...

  8. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

  9. webapi框架搭建-安全机制(二)-身份验证

    webapi框架搭建系列博客 身份验证(authentication)的责任是识别出http请求者的身份,除此之外尽量不要管其它的事.webapi的authentication我用authentica ...

随机推荐

  1. ExtJs 带参数的MVC

    题记:研究使用ext两个星期了,从痛苦中逐渐走向明朗. 展示列表的子列表的数据时需要将当前的数据传给下一个mvc. 比如用户列表,点击一个用户查看该用户的日志列表. 首先是controller,放一个 ...

  2. 深入了解MyBatis返回值

    深入了解MyBatis返回值 想了解返回值,我们须要了解resultType,resultMap以及接口方法中定义的返回值. 我们先看resultType和resultMap resultType和r ...

  3. Javascript自动化文档工具JSDuck在Windows下的使用心得

    作者: zyl910 一.工具比较 为了让前端JavaScript程序更具可维护性,更利于团队开发,文档非常重要.此时便需要使用自动化文档工具了. 我对比了各种JavaScript自动化文档工具,发现 ...

  4. 「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)

    内容较多,可先收藏,目录如下: 一.什么是主从复制 二.主从复制的作用(重点) 三.主从复制的原理(重中之重) 四.三步轻松构建主从 五.必问面试题干货分析(最最重要的点) 一.什么是主从复制(技术文 ...

  5. HTML5 高级系列:web Storage

    前言 HTML5 的 web Storage 存储方式有两种:localStorage 和 sessionStorage. 这两种方式都是通过键值对保存数据,存取方便,不影响网站性能.他们的用法相同, ...

  6. 【model模型传入view的数据类型错误】传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[MapScience.PovertyAlleviation.Web.Models.Qu

    出现这个问题的原因是控制器中传给view的数据类型与View中设置的model类型不一致导致,比如控制器返回的IList类型的,而你在View里面model设置的是IEnumerable<> ...

  7. lua中易混淆函数

    lua中易混淆的函数 ipairs和pairs: ipairs只能顺序遍历table,遇到key不是数字就会退出 pairs可以遍历table中所有元素 ----------------------- ...

  8. lodash源码分析之Hash缓存

    在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...

  9. git pull与git fetch的区别

    git pull: 取回远程主机某个分支的更新,再与本地的指定分支合并. 用法: git pull <远程仓库> <远程分支名>:<本地分支名> // 如 git ...

  10. Ubuntu配置Django+ Apache2+ mysql

    # 我的Ubuntu上自带的python3.5,所以安装一下 python3.6sudo add-apt-repository ppa:jonathonf/python-3.6sudo apt-get ...