OWIN是Open Web Server Interface for .Net 的首字母缩写,他的定义如下:
OWIN在.NET Web Server 与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application.基于此标准,鼓励开发者开发简单,灵活的模块,从而推进.Net Web Development开源生态系统的发展.之前.net开发的所有webSite和Web Application不得不和IIS绑定到一起部署,对于部署,相当笨重.而OWIN正好是为了解决这个问题!
1.新建一个Console项目
2.添加Owin self host 引用,打开NuGet 程序包管理平台,输入如下代码:
>install-package Microsoft.Aspnet.WebApi.OwinSelfHost
3.新建一个名字为StartUp.cs的类,添加如下代码:
using Owin; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace TestProgram { public class Startup { public void Configuration(IAppBuilder app) { //模仿站点配置 HttpConfiguration config = new HttpConfiguration(); //添加站点路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", //这里为了类MVC特别加入了{action} defaults: new { id = RouteParameter.Optional }); app.UseWebApi(config); } } }
4.添加Controller,新建文件夹Controller,添加IndexController.cs,添加如下代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace TestProgram.Controller { public class IndexController:ApiController { public string Get(string name) { return name; } } }
5.将Owin站点启动,修改Program.cs,如下:
using Microsoft.Owin.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace TestProgram { class Program { static void Main(string[] args) { //此入口是Owin站点的宿主 string baseAddress = "http://localhost:9009/";//站点启动地址 using (WebApp.Start<Startup>(baseAddress)) { HttpClient client = new HttpClient(); //var response = client.GetAsync(baseAddress + "api/index").Result; //Console.WriteLine(response); //Console.WriteLine(response.Content.ReadAsStreamAsync().Result); Console.ReadLine();//不让宿主程序结束 } } } }
6.运行程序,打开浏览器输入 http://localhost:9009/index/index?name="RemiHoston"
由于没有设置返回的数据类型,所以默认返回XMl格式,但是,只是返回字符串并不能满足要求;但是Owin self hosted 程序宿主于Console没有提供文件下载访问,所以我们要自己提供接口支持文件访问
7.添加静态文件访问的接口
修改IndexController.cs添加如下两个方法:
[HttpGet] public HttpResponseMessage Index() { //构造文件路径,代码重构的时候可以把这一块代码封装成公用方法 var currentRunPath = AppDomain.CurrentDomain.BaseDirectory; var substringBin = currentRunPath.IndexOf("bin"); //返回Index.html文件 var path = currentRunPath.Substring(0, substringBin) + "Index.html"; var httpResponseMessage = new HttpResponseMessage(); httpResponseMessage.Content = new StringContent(File.ReadAllText(path), Encoding.UTF8); httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); //把文件内容读出来,以HttpResponseMessage的形式返回客户端 return httpResponseMessage; } /// <summary> /// 获取静态文件,比如css,javascript /// </summary> /// <param name="fileName"></param> /// <returns></returns> [HttpGet] public HttpResponseMessage GetResource(string fileName) { //构造文件路径,代码重构的时候可以把这一块代码封装成公用方法 var currentRunPath = AppDomain.CurrentDomain.BaseDirectory; var substringBin = currentRunPath.IndexOf("bin"); var path = currentRunPath.Substring(0, substringBin) + fileName; var httpResponseMessage = new HttpResponseMessage(); if (!File.Exists(path)) { httpResponseMessage.StatusCode = System.Net.HttpStatusCode.NotFound; return httpResponseMessage; } httpResponseMessage.Content = new StringContent(File.ReadAllText(path), Encoding.UTF8); httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); return httpResponseMessage; }
8.新建站点页面
站点根目录下新建Script文件夹,下载添加query-1.6.4.min.js,新建Index.html,添加如下代码:
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title>Owin默认页</title> <!--通过站点接口,下载Jquery--> <script src="getresource?filename=scripts/jquery-1.6.4.min.js"></script> <script type="text/javascript"> $(function () {$('body').append("<h1>Hello Owin!</h1>") }) </script> </head> <body> </body> </html>
运行重新刷新,页面
至此,解决了Owin Self Hosted Console 程序加载页面的问题,下一篇将在此基础上新建SignalR程序!