跨平台:使用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
- Packet for query is too large (12238 > 1024). You can change this value
- win10下端口被占用解决办法
- 微信小程序开发教程第九章:微信小程序拍照收纳开发以及删除名片等
- centos 安装sbt
- 微信小程序开发教程第七章:微信小程序编辑名片页面开发
- idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Gen
- 使用JPA中@Query 注解实现update 操作
- 微信小程序开发教程!博卡君第二弹【微信小程序项目结构以及配置】
- WCF浅尝
- 如何将页面设置为微信端才能打开
- 你不可错过的二维码生成与解析-java后台与前端js都有
- Windows服务创建及安装
- dede自定义表单增加添加时间怎么弄
- nodejs配置简单HTTP服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 01背包问题讲解(动态规划)
- python实现随机森林
- 在mysql中order by是怎样工作的?
- 多线程应用 - 阻塞队列ArrayBlockingQueue详解
- Java虚拟机 - 超级详细的类加载说明
- ReentrantLock
- 多线程应用 - 阻塞队列LinkedBlockingDeque详解
- AtomicInteger详解
- 多线程应用 - 阻塞队列LinkedBlockingQueue详解
- 多线程应用 - 超详细的AQS详情
- 多线程应用 - 基于AQS的Condition
- HashMap源码分析 - jdk8
- HashMap源码分析 - JDK7和JDK8有什么区别
- 线程应用 - 中断interrupt详解
- ThreadLocal全面解析