使用 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. 使用 CUBLAS 库给矩阵运算提速

    前言 编写 CUDA 程序真心不是个简单的事儿,调试也不方便,很费时.那么有没有一些现成的 CUDA 库来调用呢? 答案是有的,如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库. 本文将 ...

  2. Ubuntu下输入su - [root]后提示“su:认证失败”

    Ubuntu下,进行用户到管理员切换时,使用命令su - 时,提示输入的是root密码,而在Ubuntu下root的密码起始是随机生成的(后续可由用户自己设置),且ubuntu下只能调用root,不能 ...

  3. HOG特征(Histogram of Gradient)总结(转载)

    整理一下我个人觉得比较好的HOG博文 博文1:OpenCV HOGDescriptor: 参数与图解 http://blog.csdn.NET/raodotcong/article/details/6 ...

  4. MATLAB符号运算

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...

  5. 批量kill相关所有进程

    首先,用ps查看进程,方法如下: $ ps -ef …… smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal smx      ...

  6. Codeforces Round #104 (Div. 1)

    A.Lucky Conversion 题意 给定两个长度为 \(N(N \le 10^5)\) 且由4和7构成的 \(a, b\)串 对 \(a\) 可以有两种操作: 交换两个位置的字符; 改变一个位 ...

  7. URAL 1080 Map Coloring(染色)

    Map Coloring Time limit: 1.0 secondMemory limit: 64 MB We consider a geographical map with N countri ...

  8. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  9. Unity摄像机

    把相机做为人物的子对象,就可以制作: 1.第1人称摄像机:把摄像机摆在眼睛前面 2.第3人称摄像机:把摄像机摆在人后上面 Clear Flags: http://www.haogongju.net/a ...

  10. 递归遍历多维数组(树数据结构)的超级简单方式,并且可以递归超过200层,摘自<<PHP精粹:编写高效PHP代码>>

    <?php $array = array( "Hello", // Level 1 array( "World" // Level 2 ), array( ...