使用 OWIN 作为 ASP.NET Web API 的宿主

ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动 设备)的 HTTP 服务。 ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。

ASP.NET Web API 是 OWIN 兼容的, 因此可以在 OWIN 服务器上运行。

接下来使用 Xamarin Studio 创建一个 OWIN 兼容的 C# 类库, 也就是 OWIN 中定义的“应 用 (Application)” , 然后在不同的 OWIN 服务器/宿主上运行。

创建 OWIN 兼容的 Web API 类库

打开 Xamarin Studio, 新建一个 C# 类库项目, 如下图:

然后向项目中添加 Microsoft.AspNet.WebApi.Owin 包, 相关依赖的包会自动添加,

最终项目依赖的包如下表, 如果没有在 packages.config 文件中列出, 可以再次手工添 加上去。

  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin
  • Newtonsoft.Json
  • Owin

我们的目的是创建 OWIN 兼容的 Web API 应用, 自然要先添加一个 OWIN 约定的 Startup 类, 来配置我们的 OWIN 应用。

向项目中添加一个 Startup 类 , 代码如下:

public class Startup {

    public void Configuration(IAppBuilder appBuilder) {
// 创建 Web API 的配置
var config = new HttpConfiguration();
// 启用标记路由
config.MapHttpAttributeRoutes();
// 默认的 Web API 路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// 将路由配置附加到 appBuilder
appBuilder.UseWebApi(config);
}
}

按照 Web API 项目的约定, 在项目中添加一个名称为 Controllers 的文件夹, 然后新建 一个 ValuesController 类, 设置其基类为 System.Web.Http.ApiController , 作为示 例, 其内容与 Visual Studio 自带的 Web API Controller 模板一致, 如下所示:

public class ValuesController : ApiController {

    // GET api/values
public IEnumerable<string> Get() {
return new string[] { "value1", "value2" };
} // GET api/values/5
public string Get(int id) {
return "value";
} // POST api/values
public void Post([FromBody]string value) {
} // PUT api/values/5
public void Put(int id, [FromBody]string value) {
} // DELETE api/values/5
public void Delete(int id) {
}
}

在 OWIN 环境下运行 Web API

OWIN 目前有兩個比较成熟的服务器:

  • Katana 微软的 OWIN 服务器, 如果没有指定 OWIN 服务器, 则作为默认的 OWIN 服务器。
  • Nowin 社区版 OWIN 服务器, 纯 C# 实现, 可以运行在 .NET 和 Mono 运行。

使用 Katana 服务器运行

在 Katana 下运行 OWIN 应用是很容易的, 新建一个命令行程序项目, 项目名称为: Owin02_WebApi_Katana , 然后向项目中添加下面的 NuGet 包:

  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.AspNet.WebApi.OwinSelfHost
  • Microsoft.Owin
  • Microsoft.Owin.Host.HttpListener
  • Microsoft.Owin.Hosting
  • Newtonsoft.Json
  • Owin

在默认的 Program.cs 文件的 Main 方法中, 添加下面的代码:

public static void Main(string[] args) {

    var baseAddress = "http://localhost:9000/";

    var startOpts = new StartOptions(baseAddress) {
// katana http listener
ServerFactory = "Microsoft.Owin.Host.HttpListener"
}; using (WebApp.Start<Owin02_WebApi.Startup>(startOpts)) {
var client = new HttpClient {
BaseAddress = new Uri(baseAddress, UriKind.Absolute)
}; var requestTask = client.GetAsync("api/values");
requestTask.Wait();
var response = requestTask.Result;
Console.WriteLine(response); var readTask = response.Content.ReadAsStringAsync();
readTask.Wait();
Console.WriteLine(readTask.Result); Console.ReadLine();
}
}

现在运行 Owin02_WebApi_Katana 项目, 命令行显示如下:

也可以通过浏览器来访问 http://localhost:9000/api/values , 得到的结果如下:

使用 Nowin 服务器运行

OWIN 兼容的应用可以在任何 OWIN 服务器上运行, 下面就看看如何在 Nowin 上运行。

最简单的方法是将上面代码中 StartOptions 的 ServerFactory 属性设置为 Nowin , 然 后在添加 Nowin 包就可以运行了:

var baseAddress = "http://localhost:9000/";

var startOpts = new StartOptions(baseAddress) {
// Nowin
ServerFactory = "Nowin"
};

不过这样会依赖包 Microsoft.Owin.Hosting , 其实 Nowin 自身也提供了 Hosting 的 功能, 下面就看如何直接从 Nowin 启动。

新建一个 C# 命令行程序, 项目名称为 Owin02_WebApi_Nowin , 添加下面的 NuGet 包:

  • Microsoft.Owin
  • Nowin
  • Owin

向 Program.cs 文件中的 Main 方法添加下面的代码:

public static void Main(string[] args) {
var appBuilder = new AppBuilder();
Nowin.OwinServerFactory.Initialize(appBuilder.Properties); var startup = new Owin02_WebApi.Startup();
startup.Configuration(appBuilder); var builder = new ServerBuilder();
var ip = "127.0.0.1";
var port = 8888;
builder.SetAddress(System.Net.IPAddress.Parse(ip)).SetPort(port)
.SetOwinApp(appBuilder.Build())
.SetOwinCapabilities((IDictionary<string, object>)appBuilder.Properties[OwinKeys.ServerCapabilitiesKey]); using (var server = builder.Build()) { Task.Run(() => server.Start()); var baseAddress = "http://" + ip + ":" + port + "/";
Console.WriteLine("Nowin server listening " + baseAddress); var client = new HttpClient {
BaseAddress = new Uri(baseAddress, UriKind.Absolute)
}; var requestTask = client.GetAsync("api/values");
requestTask.Wait();
var response = requestTask.Result;
Console.WriteLine(response); var readTask = response.Content.ReadAsStringAsync();
readTask.Wait();
Console.WriteLine(readTask.Result); Console.ReadLine();
}
}

如果没错的话就可以看到和 Owin02_WebApi_Katans 一致的效果了, 而且 Nowin 是开源的 纯 .NET 实现, 在 Mono 的环境下也可以运行, 下面是 Mac 系统下的运行截图:

使用 OWIN 作为 ASP.NET Web API 的宿主的更多相关文章

  1. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  2. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  3. 使用 OWIN Self-Host ASP.NET Web API 2

    Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层.OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序而离 ...

  4. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证 chsakell分享了前端使用AngularJS,后端使用ASP. ...

  5. ASP.NET Web API的安全管道

    本篇体验ASP.NET Web API的安全管道.这里的安全管道是指在请求和响应过程中所经历的各个组件或进程,比如有IIS,HttpModule,OWIN,WebAPI,等等.在这个管道中大致分两个阶 ...

  6. ASP.NET Web API 管道模型

    ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是 ...

  7. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  8. ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

  9. (转)【ASP.NET Web API】Authentication with OWIN

    概述 本文说明了如何使用 OWIN 来实现 ASP.NET Web API 的验证功能,以及在客户端与服务器的交互过程中,避免重复提交用户名和密码的机制. 客户端可以分为两类: JavaScript: ...

随机推荐

  1. 机器学习技法-AdaBoost元算法

    课程地址:https://class.coursera.org/ntumltwo-002/lecture 重要!重要!重要~ 一.Adaptive Boosting 的动机 通过组合多个弱分类器(hy ...

  2. 我看的公开课系列--《TED:对无知的追求》 by stuart firestein

    http://open.sina.com.cn/course/id_1047/ What scientists do is not just collect data and collect fact ...

  3. java NIO-我们到底能走多远系列(39)

    献给各位: Satisfied MindRed Hayes and Jack RhodesHow many times have you heard someone say,"If I ha ...

  4. myeclipse 清理项目缓存的几大步骤

    http://blog.csdn.net/moneyshi/article/details/49247169 相信大家被项目缓存折腾过吧,这里罗列几条清除项目缓存的方法 1.项目清理: 选择菜单栏的P ...

  5. 命令行创建畸形文件夹+畸形目录管理工具(DeformityPath)

    命令行创建畸形文件夹: 第一步:在运行中输入cmd,回车,打开命令行窗口 第二步:在命令行窗口中切换到想要建立文件夹的硬盘分区,如D盘(输入d:) 第三步:输入 MD 123..\ 回车,注意文件夹名 ...

  6. poj 3159 dijkstra 最短路

    Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...

  7. jQuery获取页面及个元素高度、宽度【转】

    获取浏览器显示区域(可视区域)的高度 :    $(window).height();    获取浏览器显示区域(可视区域)的宽度 : $(window).width();    获取页面的文档高度 ...

  8. leetcode 142. Linked List Cycle II ----- java

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note ...

  9. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  10. Python学习(3)——if语句

    虽然在之前接触过C.C++.Java等,但是还是觉得Python写出来的好看o(≧v≦)o~,简洁明了! score = raw_input("score:") score=int ...