跨平台:使用OWIN 为WebAPI 宿主

OWIN是什么? OWIN的英文全称是Open Web Interface for .NET。 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口。 那Web接口是谁和谁之间的接口呢?是Web应用程序与Web服务器之间的接口,OWIN就是.NET Web应用程序与Web服务器之间的接口。 为什么需要这样一个接口呢?因为.NET Web应用程序是运行于Web服务器之中的,.NET Web应用程序需要通过Web服务器接收用户的请求,并且通过Web服务器将响应内容发送用户。如果没有这样一个接口,.NET Web应用程序就要依赖于所运行的具体Web服务器,比如ASP.NET应用程序要依赖于IIS。有了这个接口,ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器。 所以,OWIN的作用就是通过引入一组抽象接口,解耦了.NET Web应用程序与Web服务器,再次体现了接口的重要性。在软件开发中,每次解耦都是一次很大的进步。 【进一步的理解】 OWIN是对ASP.NET Runtime的抽象。 ASP.NET 5.0是OWIN的一种实现。 通过下面几张图可以更直观地理解:

了解了一些基础理论,下面我们来实际开发。

OWIN Self-Host ASP.NET Web API 2

首先我们创建一个空的控制台项目:

然后通过Nuget来安装 Microsoft.AspNet.WebApi.OwinSelfHost

我们也可以打开NuGet控制台..输入命令:Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

然后我们再添加一个OWIN启动类名为Startup 如下:

Startup中编写代码如下:

using Owin;
using System;
using System.Web.Http;


namespace OwinBlog
{
    public class Startup
    {
        public void Configuration(IAppBuilder appBuilder)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            appBuilder.UseWebApi(config);
        }
    }
}
下面我们编写一个WebAPI的控制器,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;


namespace OwinBlog
{
    public class BlogController : ApiController
    {
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new string[] { "linezero", "owin linezero blog" };
        }


        // GET api/<controller>/5
        public string Get(int id)
        {
            return string.Format("owin {0} by:linezero",id);
        }


        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }


        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }


        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}
最后我们启动OWIN,在Program.cs 加入以下代码:

using Microsoft.Owin.Hosting;
using System;


namespace OwinBlog
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:9000/";
            //string baseAddress = "http://+:9000/"; //绑定所有地址,外网可以用ip访问 需管理员权限
            // 启动 OWIN host 
            WebApp.Start<Startup>(url: baseAddress);
            Console.WriteLine("程序已启动,按任意键退出");
            Console.ReadLine(); 
        }
    }
}

启动控制台程序,然后访问我们刚才设置的地址:

http://localhost:9000/api/blog

http://localhost:9000/api/blog/88

跨平台

通过OWIN宿主ASP.NET WebAPI还可以完美的兼容Mono 3 及以上版本。

下面我们就来看看一下运行在linux下。首先大家要安装好 mono。

可以参考:http://www.cnblogs.com/linezero/p/4774850.html

测试系统版本:centos 6.4 mono 3.10.0

将OWIN 启动绑定改为绑定所有地址,然后编译。代码如下:

using Microsoft.Owin.Hosting;
using System;


namespace OwinBlog
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://+:9000/"; //绑定所有地址,外网可以用ip访问
            // 启动 OWIN host 
            WebApp.Start<Startup>(url: baseAddress);
            Console.WriteLine("程序已启动,按任意键退出");
            Console.ReadLine(); 
        }
    }
}

将程序上传到linux 下,然后定位到程序目录,通过命令启动程序:mono OwinBlog.exe

程序已成功启动,下面我来访问看看:

参考链接: http://www.cnblogs.com/dudu/p/what-is-owin.html http://www.cnblogs.com/shanyou/p/3650705.html http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-02-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

WPF 开发自动开机启动程序

将快捷方式创建在启动文件夹就可以让程序开机自动启动,上面的方法已经可以传入 lnkFilePath 所以只需要设置 lnkFilePath 是启动文件夹就可以

27920
来自专栏小狼的世界

Silverlight学习笔记一:准备环境,开始第一个Siverlight 3程序

   工欲善其事,必先利其器,我一直觉得对于MS的东西,没有个强大的编辑器是万万不行的,绝对不想PHP那样的随意。所以,开始之前,我们必须准备好需要的工具,而且...

10420
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 查询Details和Delete方法

在这部分教程中,接下来我们将讨论自动生成的Details和Delete方法。 查询Details和Delete方法 打开Movie控制器并查看Details方法...

22960
来自专栏葡萄城控件技术团队

ASP.NET 5系列教程 (六): 在 MVC6 中创建 Web API

ASP.NET 5.0 的主要目标之一是统一MVC 和 Web API 框架应用。 接下来几篇文章中您会了解以下内容: ASP.NET MVC 6 中创建简单的...

29360
来自专栏葡萄城控件技术团队

ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用

开始使用 使用Wijmo制作MVC5应用程序,首先要做的是安装Wijmo 。 测试环境 VS2013(VS2010,VS2012支持MVC3,MVC4)、MVC...

24280
来自专栏木宛城主

ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇

在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好...

66280
来自专栏Oracle

Oracle内存数据库使用

t.inmemory, t.inmemory_priority, t.inmemory_distribute, t.inmemory_compression, ...

14620
来自专栏walterlv - 吕毅的博客

UWP 应用中 CoreApplication / Application, CoreWindow / Window 之间的区别

发布于 2018-07-29 23:51 更新于 2018-08...

33720
来自专栏张善友的专栏

Json.NET 3.0

Json.NET,提供相当完整的文档之外,还提供了 LINQ to JSON 的 LINQ Provider 可以更方便的读取JSON 对象,今后将可比以往用更...

21060
来自专栏张善友的专栏

Windows PowerShell 2.0十大新特性

  新的cmdlet、操作符和变量,再加上诸如脚本调试以及后台任务这样的新功能,PowerShell 2.0将帮助你开启PowerShell脚本编程的新世界。 ...

210100

扫码关注云+社区

领取腾讯云代金券