我们知道,借助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. node.js 使用NAPI写C++插件,(部分转帖)

    原文:https://www.cnblogs.com/chyingp/p/nodejs-learning-napi.html 可能是版本问题,我用node v10.6.0 遇到了问题 不过解决了. 一 ...

  2. Maven中阿里云私服配置

    在国内maven仓库连接速度太慢 ,虽然对于很多互联网企业和大中型软件公司,建个镜像是分分钟的事.但对于个人开发者确实是个问题.解决办法可以用阿里云的MAVEN私服.有两种方法: 1.在$MAVEN_ ...

  3. 天兔(Lepus)数据库监控系统安装笔记

    天兔(Lepus)数据库监控系统安装笔记 一.部署:本次操作系统:centos6.9 IP:192.168.153.145Lepus_v3.8_beta MySQL-python-1.2.5xampp ...

  4. @无痕客 https://www.cnblogs.com/wuhenke/archive/2012/12/24/2830530.html 通篇引用

    无痕客 https://www.cnblogs.com/wuhenke/archive/2012/12/24/2830530.html 关于Async与Await的FAQ 关于Async与Await的 ...

  5. C# 使用System.Speech 进行语音播报和识别

    C# 使用System.Speech 进行语音播报和识别 using System.Speech.Synthesis; using System.Speech.Recognition; //语音识别 ...

  6. 每日一练ACM 2019.0417

    Problem Description 给定两个正整数,计算这两个数的最小公倍数.   Input 输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.   Output 对于每个测试 ...

  7. 解决mysql for docker容器报错:Authentication plugin 'caching_sha2_password' cannot be loaded

    为图方便,懒得在mac上安装mysql了,一个是管理不方便,第二个是为了方便多机器同步开发环境.就使用docker安装了. 拉取mysql镜像 docker pull mysql 运行mysql实例 ...

  8. 2019.03.29 bzoj5463: [APIO2018] 铁人两项(圆方树+树形dp)

    传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c) ...

  9. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  10. go 函数类型

    在go中,函数也可以被当成数据类型 e.g:下面有两个函数,+.-,然后定义了一个函数类型FuncType1,然后对funcType1附于不同的函数,则funcType1就可以执行相应的函数 pack ...