为了封装一个聊天模块,这些天真是绞尽脑汁,不过也有很多收获,比如下面这个自托管的最简配置,
不仅内置了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());
}
}
照张全家福:
别看现在的成品非常简单,实现过程可是走了不少弯路。。。。
希望这篇文章能帮到大家