.NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service
实在是被某软忽悠瘸了,愤而写此一篇。希望能让同样需求的同学们少走弯路。
某软在《在 Windows 服务中托管 ASP.NET Core》中,介绍了通过创建Worker Service工程,来将.NET Core和.NET 5的程序以Windows Service的形式运行。但是某软你得说明,托管ASP.NET Core Web Application,并不需要额外创建一个Worker Service工程啊,再加上GitHub上两个放在一块的sample project,直接把我误导瘸了……
今天我就要记录一下这个事情,其实是多么的简单,控诉某软文档不走心。
接下来让我们实践一把。根据剧情需要,这里应该是一个Blazor WebAssembly App。

记得勾选ASP.NET Core hosted,会为我们额外创建一个用于Host的ASP.NET Core Web Application。如果不新建Web Application,同时也没有可用的Web Application,单一的Blazor WebAssembly App是没有办法进行使用Windows Service托管的。

Create按钮点击下去,只见Visual Studio一通操作,建了三个工程。我们稳住不要慌,按F5运行,现在的情况是下图这个样子。左边是我们新建的Blazor App在浏览器里跑起来的样子。右侧的Solution Explorer中,BlazorHostInWinService.Client是程序的主体,所有的Page都在这里画。BlazorHostInWinService.Server是一个空的WebApi工程,其中的WeatherForecastController提供了给Blazor Fetch Data页面测试用的天气数据。至于最下面的Shared工程,可以理解为Client和Server之间传递数据,共享所使用的DTO对象,在该示例中,仅有一个Class WeatherForecast。

当前我们的程序是通过IIS Express来运行的,接着我们要把该工程通过Windows Service来托管运行。首先需要给BlazorHostInWinService.Server工程添加NuGet包 Microsoft.AspNetCore.Hosting.WindowsServices。再打开Program.cs文件,为IHostBuilder对象添加对UseWindowsService方法的调用。
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
额,好像也没有其他事情可以做了,让我们publish该项目。依然是选择BlazorHostInWindowsService.Server工程,右键菜单中的publish点击后,出现如下界面,选择Folder后点击Finish。

在如下图的界面中,再一次开心的点击publish。编译过程中我们可以摸会鱼,直到在Output窗口中出现迷人的信息:
========== Build: 3 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

然后让我们打开Target location,即bin\Release\net5.0\publish\。把所有的文件都拷贝到我们希望部署的位置,比如C:\Users\xingzheng\Documents\BlazorWinService文件夹。
最后就是创建Windows Service了,我们打开具有admin权限的CMD窗口。键入
sc create FirstBlazorAppService binPath="C:\Users\dell\Documents\BlazorWinService\BlazorInWinServiceTest1.Server.exe"

此时我们打开Windows Services的界面,启动FirstBlazorAppService即可。再返回到浏览器输入http://localhost:5000/

标题是我在Index.razor文件中手动改的,也为了区别之前通过IIS Express运行的页面。
本篇就到这里,简单地介绍了如何将Blazor App通过Windows Service托管。
GitHub:
https://github.com/manupstairs/BlazorHostInWinService
.NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service的更多相关文章
- Ext.Net学习笔记11:Ext.Net GridPanel的用法
Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Python3+Selenium3+webdriver学习笔记11(cookie处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...
- 并发编程学习笔记(11)----FutureTask的使用及实现
1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...
- 《C++ Primer Plus》学习笔记11
<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
随机推荐
- 功能按钮发post请求 参数放入body中
1.功能按钮事件参数 queryBody_ids:{data.ids} 前端会生成下划线后面的编码ids,并替换{data.ids} 2.后端建参数model后端参数可以只包含前端返回的部分参数 [D ...
- XV6学习(16)Lab net: Network stack
最后一个实验了,代码在Github上. 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数.不过看以前的实验好像还要实现上层socket相关的代码,今年就只 ...
- Redis 持久化(Persistence)
作为内存数据库,Redis 依然提供了持久化机制,其主要目的有两个: 安全:保证进程崩溃后数据不会丢失 备份:方便数据迁移与快速恢复 Redis 同时提供两种持久化机制: RDB 快照:数据库在某个时 ...
- html图片占位符插件holder.js
1.下载源码 下载链接:http://www.bootcdn.cn/holder/ 2.在HTML中引入holde.js <script src="holder-js-2.9.4\ho ...
- FZU 2082 过路费(树链剖分 边权)题解
题意:给出每条边权值,可以更新每条边权值,询问两个点路径的最小权值 思路:重链剖分边权化点权,让每个儿子节点继承边权. 插点权的时候比较边的两个节点的深度,插进儿子节点中. 代码: #include& ...
- Pycharm无法import caffe
这里是首先建立在读者可以在终端导入而无法在Pycharm中导入的情况下的: 参考链接(问题的最后一个回答) 选用了虚拟环境的python作为解释器, 但由于caffe的特殊性, 依然没有导入, 原因就 ...
- matplotlib 图标显示中文
matplotlib 显示中文 Method_1: # 添上: plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcPara ...
- 前端 Web 异常监控系统 All In One
前端 Web 异常监控系统 All In One Sentry https://sentry.io trackjs https://trackjs.com/ rollbar https://rollb ...
- Interview of Chinese IT companies Ratings and Reviews website/app
Interview of Chinese IT companies Ratings and Reviews website/app // js hack const getShitRank = (st ...
- Google Meet & gmail & video conference
Google Meet & gmail & video conference Conv-2019 & live stream Google Meet https://meet. ...