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. Chrome浏览器调试技巧

    本文主要讲解针对chrome浏览器的调试方案,对于其他浏览器其实大同小异. 先来入门一点的 DOM元素调试 看上图: 以上图表明的1,2,3,4,5标记说明: 1,为移动设备模拟器,chorme现在是 ...

  2. python学习第一天基础篇

    学习背景:决定开始学习python之前,因为公司基本都是微软系统,所以很少碰到linux系统,机缘巧合接到了一个项目是使用shell对mysql进行backup,因为公司唯一的系统工程师是微软在行,对 ...

  3. 側滑回退的layout(相似IOS側滑回退到上一个activity)

    用过apple的同学应该都知道,大多数IOS应用都支持側滑回退,就不具体说明了,直接上图: 作为使用ios的android开发人员来说,我是特别喜欢这个功能的.既然这样,那就在android上也实现这 ...

  4. OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止

    解决的方法,大家来分享一下 1:注冊表中 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/OracleOraDb11g_home1TNSLis ...

  5. 看看android基础知识,谁帮我作答

    无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...

  6. More DETAILS! PBR的下一个发展在哪里?

    最近几年图形学社区对PBR的关注非常高,也许是由于Disney以及一些游戏引擎大厂的助推,也许是因为它可以被轻松集成进实时渲染的游戏引擎当中,也许是因为许多人发现现在只需要调几个参数就能实现具有非常精 ...

  7. 如何连接别人电脑上的Oracle数据库--duende99

    需要一些前提条件: 1.对方的主机能被连接(如在同一局域网内) 2.需要知道对方数据库IP.端口号.服务名 3.需要知道对方提供的管理数据库的用户名及密码 连接方法: 1.在本地的oracle安装目录 ...

  8. org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

    异常信息 org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable represen ...

  9. Say Hello to ConstraintLayout

    ConstraintLayout介绍 ConstraintLayout让你可以在很平的view结构(没有多层布局嵌套)中构建一个复杂的布局结构. 有点像RelativeLayout, 所有的view都 ...

  10. nginx取结构体地址

    linux内核提供了一个container_of()宏,可以根据结构体某个成员的地址找到父结构的地址. #define container_of(ptr, type, member) ({ \ con ...