最近试用了一下 RavenDb 数据,该数据库是一种 nosql 数据库。底层使用 lucene.net 做为数据库文件。
觉得更有意思的是他的 web管理工具,居然绕过了iis 而是使用一个 windows服务承载的一个网站。
所以研究了一下,原来它用的是 owin 技术。
但是在mvc4 以前 ,暂时不能承载 webform 、mvc 的网站,原因是webform 、mvc 对 iis 的耦合度太高。因为他们引用了 system.web.dll 组件。
该组件依赖 iis。
期待 mvc 后续版本不再依赖 system.web.dll ~~~~~
开始构建web服务器,下面只复制了一些关键部分的 代码。
实例程序可以去我的资源中下载
下载地址:http://download.csdn.net/detail/xxj_jing/9583113
控制台程序
class Program { static void Main(string[] args) { //监听地址 string baseAddress = string.Format("http://{0}:{1}/",System.Configuration.ConfigurationManager.AppSettings.Get("Domain"),System.Configuration.ConfigurationManager.AppSettings.Get("Port")); //启动监听 using (WebApp.Start<Startup>(url: baseAddress)) { Console.WriteLine("host 已启动:{0}",DateTime.Now); Console.WriteLine("访问:{0}/page/index.html",baseAddress); Console.ReadLine(); } } }
Startup 请求处理程序(WebApp.Start<T>() 方法会自动执行 T.Configuration() 方法)
using System.IO; using System.Net.Http.Formatting; using Owin; using Microsoft.Owin; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace OwinSelfhostSample { class Startup { private static string _siteDir = System.Configuration.ConfigurationManager.AppSettings.Get("SiteDir"); // This code configures Web API. The Startup class is specified as a type // parameter in the WebApp.Start method. public void Configuration(IAppBuilder app) { // web api 接口 HttpConfiguration config = InitWebApiConfig(); app.UseWebApi(config); //静态文件托管 app.Use((context,fun) => { return myhandle(context,fun); }); } /// <summary> /// 路由初始化 /// </summary> public HttpConfiguration InitWebApiConfig() { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "Default",routeTemplate: "api/{controller}/{action}",defaults: new { id = RouteParameter.Optional } ); config.Formatters .XmlFormatter.SupportedMediaTypes.Clear(); //默认返回 json config.Formatters .JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping("datatype","json","application/json")); //返回格式选择 config.Formatters .XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping("datatype","xml","application/xml")); //json 序列化设置 config.Formatters .JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore }; return config; } public Task myhandle(IOwinContext context,Func<Task> next) { //获取物理文件路径 var path = GetFilePath(context.Request.Path.Value); //验证路径是否存在 if (File.Exists(path)) { return SetResponse(context,path); } //不存在返回下一个请求 return next(); } public static string GetFilePath(string relPath) { return Path.Combine( AppDomain.CurrentDomain.BaseDirectory,_siteDir,relPath.TrimStart('/').Replace('/','\\')); } public Task SetResponse(IOwinContext context,string path) { var perfix = Path.GetExtension(path); if(perfix==".html") context.Response.ContentType = "text/html; charset=utf-8"; else if (perfix == ".js") context.Response.ContentType = "application/x-javascript"; else if (perfix == ".js") context.Response.ContentType = "atext/css"; return context.Response.WriteAsync(File.ReadAllText(path)); } } }
app.config
<appSettings> <add key="Domain" value="localhost"/> <add key="port" value="9000"/> <add key="SiteDir" value="..\..\"/> </appSettings>
web api 的控制器
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using System.Web.Http; using OwinSelfhostSample.models; namespace OwinSelfhostSample.controllers { public class ValuesController : ApiController { //api/valuses/time [HttpGet] [HttpPost] public timeResult time() { return new timeResult() { id = DateTime.Now.Ticks,time = DateTime.Now,remark = DateTime.Now.ToString() }; } [HttpGet] [HttpPost] public dynamic Sleep(int sleep) { if (sleep < 1 || sleep>10) sleep = 1; sleep *= 1000; var begionTime = DateTime.Now.ToString("HH:mm:ss"); System.Threading.Thread.Sleep(sleep); var endTime = DateTime.Now.ToString("HH:mm:ss"); return new { sleep = sleep,begionTime = begionTime,endTime = endTime }; } // 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) { } } }原文链接:https://www.f2er.com/javaschema/283738.html