为了封装一个聊天模块,这些天真是绞尽脑汁,不过也有很多收获,比如下面这个自托管的最简配置,
不仅内置了signalr服务,还内置了webapi服务,静态资源文件服务。
为了分享这份喜悦,直接上代码
首先是托管应用start类的配置方法:
public class Startup { public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll);//设置允许跨域 var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); //允许特性路由 config.Routes.MapHttpRoute(//默认路由 name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); app.UseWebApi(config);//webApi托管 app.Use((context, fun) => { return myFileHandle(context, fun); //静态文件资源托管 }); app.MapSignalR();//注册signalr服务 } }
接着是start类包含的静态文件资源方法:
public class Startup { public void Configuration(IAppBuilder app) ... public Task myFileHandle(IOwinContext context, Func<Task> next) { //获取物理文件路径 var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "./WebForm/" , context.Request.Path.Value.TrimStart('/').Replace('/', '\\')); if (File.Exists(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 == ".css") context.Response.ContentType = "atext/css"; return context.Response.WriteAsync(File.ReadAllText(path)); } return next();//不存在返回下一个请求 } }
再就是webapi的控制类:
public class MyApiController : ApiController { public IHttpActionResult Get(string name) { return Json(new { IsSuccess = true, Msg = "this is get method" }); } public IHttpActionResult PostTest(dynamic queryData) { return Json(new { IsSuccess = true, Msg = "this is post method", Data = queryData }); } public IHttpActionResult PutTest() { return Json(new { IsSuccess = true, Msg = "this is put method" }); } public IHttpActionResult DeleteTest() { return Json(new { IsSuccess = true, Msg = "this is delete method" }); } }
最后就是启动配置:
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { using (var db = new ChatEntities()) {//数据库如果不存在,则创建数据库 db.Database.CreateIfNotExists(); } //signalr托管 WebApp.Start<Startup>(SignalR.Domain); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } }
照张全家福:
别看现在的成品非常简单,实现过程可是走了不少弯路。。。。
希望这篇文章能帮到大家