我们知道,借助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. c++常用小算法

    这篇文章列出了一些简单常用的C++容器算法,C++标准库中事实上提供了很多的算法并且有详细的介绍.如果需要详细的了解这些算法可以 参考C++在线参考手册 algrithm . 1 排序 在 #incl ...

  2. weex h5开发区别-实践初级篇

    html标签 weex中没有标签的概念,html中标签对应于weex中的Components weex 无<span> .<p> ,用<text>替代.但是< ...

  3. 每天写两个的java常见面试题—final 和static 的用法

    第一次写随笔,可能写的比较乱,更多的是作为自己记忆一些知识的方式.所有记录的东西都是自己的一些理解,很多语言可能还是从其他大牛的博客里面搬过来的. 一.static的作用: static的的作用从三个 ...

  4. Autel MaxiTPMS TS601 Wireless TPMS Sensor Reset Relearn Activate Programming Tool

    Why Choose Autel TPMS TS601? MaxiTPMS TS601 is a TPMS tool with highest performance in the world. It ...

  5. Python 判断文件是否存在

    参考:https://www.cnblogs.com/jhao/p/7243043.html

  6. [ES]elasticsearch章5 ES的分词(一)

    初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景: 1.为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢? 2.我存进去的文档到底被分成哪些词(ter ...

  7. XBee PRO 900HP远距离无线模块

    XBee PRO S3B也称为XBee-900HP无线模块,它是一款工作在频段900~928MHz之间,基于FHSS跳频技术的远距离无线数传电台核心模块.常用型号如下: 类别 型号 开发套件 XKB9 ...

  8. kali自定义分辨率(1920*1080)

    运行一下两行代码: xrandr --newmode -hsync +vsync xrandr --addmode Virtual1 "1920x1080_60.00"

  9. 前台js接收后台的json数据

    后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...

  10. [转]MYSQL性能查看(命中率,慢查询)

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...