C#自托管应用的最简配置

为了封装一个聊天模块,这些天真是绞尽脑汁,不过也有很多收获,比如下面这个自托管的最简配置,

不仅内置了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());
        }
    }

照张全家福:


别看现在的成品非常简单,实现过程可是走了不少弯路。。。。

希望这篇文章能帮到大家

猜你喜欢

转载自blog.csdn.net/foren_whb/article/details/80510714