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. MySql的隔离级别和锁的关系

    一.事务的4个基本特征  Atomic(原子性):  事务中包括的操作被看做一个逻辑单元.这个逻辑单元中的操作要  么所有成功.要么所有失败. Consistency(一致性):  仅仅有合法的数据能 ...

  2. 二分PkU3258

    <span style="color:#330099;">/* E - 二分 Time Limit:2000MS Memory Limit:65536KB 64bit ...

  3. struts2 maven整合tiles3

    最新项目发现使用tiles能够很好的将多个页面组合起来,以下就是配置信息,使用tiles3 1.首先配置maven pom.xml加入例如以下: <dependency> <grou ...

  4. &lt;转&gt; Libvirt学习总结

    感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...

  5. DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)

    为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791).因为不同的视频压缩 ...

  6. 沉迷 Docker,无法自拔(在 Docker 中运行 MySQL)

    记得之前做网站开发的时候,因为服务端用的 MySQL 数据库,为了方便调试以及隔离生产与开发环境,自己就在本地也安装了一个 MySQL 数据库.但是用着用着慢慢的也发现了一些不舒服的地方,比如常驻后台 ...

  7. javascript 面向对象设计之 Function 普通类

    var test = "Class01"; function Class01(privateValue, publicValue) { var _this = this; if ( ...

  8. SSH简单项目

    这是我学习SSH整合时的一个测试项目,代码比较简单 整个项目实现从数据库中取数据,在页面上显示.项目的结构如下: (1)数据库设计 数据库使用的是student数据库中的一个数据库表grade,表的内 ...

  9. PHP是干什么用?

    掌握PHP就是使用电脑制定规则.框架tp3.2/5.2 在结构化编程中,程序围绕着要解决的任务来设计. 面向对象编程中,程序围绕着问题域中的对象来设计. 面对对象的识别事物的方式: ●类比----&g ...

  10. while,until

    while ] 注释:中括号写的条件判断式中不能用<.=.>这类符号,要用-lt.-eq.-gt这类符号,且变量前要用$来取值 do sum=$(($sum+$i)) i=$(($i+)) ...