我们知道,借助OWIN,WebApi,SignalR,WCF 都可以创建自托管(Self-Host)实例,完全不需要IIS,静态网站也可以。

最近做一个服务器监控小工具,用 SignalR 通信,监控端是一个静态网站(挂在IIS),服务端是一个 WinForm 程序(SignalR 服务寄宿),但是我想网站也寄宿到这个 WinForm 中,这样通过 WebApp.Start 开启主机时,网站也开启了,部署也方便

为了减少配置代码,我们用一个静态文件处理的中间件 Beginor.Owin.StaticFile

Install-Package Beginor.Owin.StaticFile

在 OWIN 启动类中配置

using Beginor.Owin.StaticFile;

[assembly: OwinStartup(typeof(AisinGioro.Server.OwinStartup))]
namespace AisinGioro.Server
{
public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
//静态文件托管
app.Map("/wwwroot", map =>
{
// 允许跨域
map.UseCors(CorsOptions.AllowAll);
map.UseStaticFile(new StaticFileMiddlewareOptions
{
RootDirectory = @"D:\P22\Felix\AisinGioro\AisinGioro.WebPortal",
DefaultFile = "index.html",
EnableETag = true,
EnableHtml5LocationMode = true,
MimeTypeProvider = new MimeTypeProvider(new Dictionary<string, string>
{
{ ".html", "text/html" },
{ ".htm", "text/html" },
{ ".dtd", "text/xml" },
{ ".xml", "text/xml" },
{ ".ico", "image/x-icon" },
{ ".css", "text/css" },
{ ".js", "application/javascript" },
{ ".json", "application/json" },
{ ".jpg", "image/jpeg" },
{ ".png", "image/png" },
{ ".gif", "image/gif" },
{ ".config", "text/xml" },
{ ".woff2", "application/font-woff2"},
{ ".eot", "application/vnd.ms-fontobject" },
{ ".svg", "image/svg+xml" },
{ ".woff", "font/x-woff" },
{ ".txt", "text/plain" },
{ ".map", "text/plain" }
})
});
}); //SignalR托管
app.Map("/signalr", map =>
{
// 允许跨域
map.UseCors(CorsOptions.AllowAll); var hubConfiguration = new HubConfiguration
{
//Resolver = **,
// You can enable JSONP by uncommenting line below.
// JSONP requests are insecure but some older browsers (and some
// versions of IE) require JSONP to work cross domain
EnableJSONP = true,
EnableDetailedErrors = true
}; // Run the SignalR pipeline. We're not using MapSignalR
// since this branch is already runs under the "/signalr"
// path.
map.RunSignalR(hubConfiguration);
}); //该值表示连接在超时之前保持打开状态的时间长度。
//默认为110秒
//GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110); //该值表示在连接停止之后引发断开连接事件之前要等待的时间长度。
//默认为30秒
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds();
}
}
}

其中 RootDirectory 也可以配置相对目录,比如 ../app/wwwroot

MimeTypeProvider 属性设置 MIME 映射(Content-Type),如果不设置,Beginor.Owin.StaticFile 只能能判断普通的类型(比如 html,css,js),所以还是设置下比较好

创建Web服务监听,开启主机

private void DoWork()
{
try
{
//创建WEB服务器监听
using (WebApp.Start<OwinStartup>(_hostUrl))
{
if (this.OnStartSucceed != null)
this.OnStartSucceed(this, EventArgs.Empty); LogHelper.Trace("Server started! {0}", _hostUrl); while (!cancelTokenSource.IsCancellationRequested)
Thread.Sleep();
} LogHelper.Trace("Server stopped!"); if (this.OnStopSucceed != null)
this.OnStopSucceed(this, EventArgs.Empty); //Server stopped!
}
catch (Exception ex)
{
ex = ex.GetBaseException();
LogHelper.Error(ex.Message + " " + _hostUrl); if (this.OnFailed != null)
this.OnFailed(this, new ErrorOccuredEventArgs(ex));
}
}

如果外部程序执行 cancelTokenSource.Cancel,主机服务停止运行

=========================

客户端连接SignalR用这个地址:http://localhost:9000/signalr

而访问网站,用这个地址:http://localhost:9000/wwwroot/

OWIN 自托管静态网站的更多相关文章

  1. Azure 项目构建 – 托管静态网站

    本课程主要介绍了如何在 Azure 平台上快速构建和部署基于 Azure Web 应用的静态托管网站, 实践讲解如何使用 Azure 门户创建 Web 应用, 部署静态网站源代码,设置自定义域名等. ...

  2. 存储账户静态网站与Azure CDN

    背景 把静态网站或文件托管在对象存储上,有很多可能很多好处,比如说:可以节省成本,因为相对虚机更便宜:性能更优,因为可以依赖于对象存储本身的高吞吐以及 CDN 的:更好的高可用性,因为也可以依赖于对象 ...

  3. 使用 Java 和 Maven (JBake) 生成静态网站

    使用 JBake("mvn generate-resources")构建您的静态网站或博客.使用布局.宏和数据文件. 我们迁移了整个www.optaplanner.org网站(13 ...

  4. 在Azure Storage 托管HTTP静态网站

    本文演示了在Azure Storage托管HTTP静态网站. 注意:HTTP已经不建议使用. 创建Azure StorageV2 存储账户 账户类型选择“StorageV2(通用版V2)”: 本例中, ...

  5. Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)

    原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...

  6. Express static 托管静态文件 理解

    今天偶尔看了一下服务端渲染,遇到了express.static, 在以前学习webpack配置服务端渲染时,也使用express.static 中间件,两者配置不太一样,由于当时也没有认真学,所以 一 ...

  7. Express (Routing、Middleware、托管静态文件、view engine 等等)

    1. Express 简介 Express 是基于 Node.js 平台,快速.开放.极简的 web 开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用. Express 不对 ...

  8. [技术翻译]使用Nuxt生成静态网站

    本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...

  9. CODING 静态网站服务升级,快速、稳定、高拓展!

    CODING 静态网站拥有强大的页面托管服务,目前已有数万开发者.设计师.产品经理.团队与企业使用 CODING 静态网站托管了他(她)们的个人网站.博客.企业与产品官网.在线文档等.CODING 静 ...

随机推荐

  1. angular使用Md5加密

    一.现象 用户登录时需要记住密码的功能,在前端需要对密码进行加密处理,增加安全性 二解决 1.利用npm(如果没有,先自行安装npm)安装ts-md5 npm install ts-md5 --sav ...

  2. 《笨方法学Python》加分题17

    题目通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝. 新知识os.path.exi ...

  3. 安装和使用JD-Eclipse插件

    http://www.cnblogs.com/0616--ataozhijia/p/3924411.html http://aniyo.iteye.com/blog/1336622

  4. 密码与安全新技术专题之AI与密码

    20189217 2018-2019-2 <密码与安全新技术专题>第五周作业 课程:<密码与安全新技术专题> 班级: 1892 姓名: 李熹桥 学号:20189214 上课教师 ...

  5. H5获取原生传过来的值

    项目开发中,可能会涉及到原生页面跳转到H5页面,然后H5页面要返回原生页面,通常使用的方法就会失效:this.$router.go(-1);怎么解决呢,这样就需要原生跳转H5页面的时候,在URL里传递 ...

  6. Trachtenberg(特拉亨伯格)速算系统

    二战期间,俄国的数学家Jakow Trachtenberg(1888-1953)被关进纳粹集中营,在狱中,他开发出了一套心算算法,这套算法后来被命名为Trachtenberg(特拉亨伯格)速算系统. ...

  7. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

  8. 一些简单的ajax的特点,方法、属性。以及ajax的创建 请求

    1.ajax的特点,基本原理,属性. ajax:页面的局部刷新 Asynchronous JavaScript And Xml JavaScript:更新局部的页面 XML:一般用于请求数据和响应数据 ...

  9. h5 调起ios数字键盘的坑,限制特殊字符输入方案

    最近有个需求是利率只允许输入数字和小数点,用以下 <input type="number" pattern="[0-9]*"> 在ios会调起数字键 ...

  10. js实现(可实现局部打印)

    1.js实现(可实现局部打印) <input id="btnPrint" type="button" value="打印" oncli ...