由于 Blazor-WebAssembly 是在浏览器中运行的,通常不需要执行服务器代码,只要有个“窝”能托管并提供相关文件的下载即可。所以,当你有一个现成的 Blazor wasm 项目,没必要用其他语言重写,或者你不想用 ASP.NET Core 来托管(有些大材小用了),就可以试试用 node.js 来托管。

要实现这个不需要掌握什么新的知识,所以咱们直接开工干活。

首先,咱们做好 Blazor wasm 应用的开发。

dotnet new blazorwasm-empty -n Demo -o .

blazorwasm-empty 模板创建的项目只带一些基本代码和 Hello World,没有演示代码——无Counter无假天气预报。

然后,Program.cs 文件也可以精简一下。

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app"); await builder.Build().RunAsync();

#app 是CSS筛选器,即选择 id 为 app 的元素来呈现 Razor 组件。这个相信各位都懂。

为了更好地演示,咱们把 Index 组件改一下,加一点交互功能,以便后面可以验证 Blazor 是否正常启动。

@page "/"

<h1>Hello, world!</h1>
<button @onclick="ClickMe">点这里中大奖</button>
<div>@Message</div> @code{
private string? Message{get;set;} void ClickMe()
{
int xx = Random.Shared.Next(100, 700);
Message = $"恭喜你获得{xx}万假钞!";
}
}

这个不复杂,就是点击一下按钮,然后生成个随机整数,并修改 Message 属性。处理 click 事件要注意加上 @,如果是 onclick 你只能用 js 去写,要想用 C# 来写代码,就得用 @onclick。

接着,试执行一下,保证没有错误,能正常运行。

现在,你打开 \bin\Debug\net7.0\wwwroot 目录,里面你看到有个 _framework 目录,这个目录就是我们要的。不过,这个体积太大,不适合。咱们将项目发布一下,这样体积会变小很多。

我们不需要 wwwroot 目录下的东东,把整个目录“咔嚓”掉(这里指的是项目中的 wwwroot 目录,不是输出目录的)。为了防止重新生成时有文件错误(一般不会),可以把 obj 和 bin 目录也删除。

执行发布命令。

dotnet publish -c PublishRelease

-c 参数也可以用 Release,差别不大。

另外新建一个目录,路径随便,不要有非英文字符(防止出错),比如这里我命名为 Server。把刚才发布的整个 _framework 目录复制到 Server 目录中。现在你可以关闭 Blazor 项目了,没它什么事了。

在 Server 目录下新建一个文件,叫 index.html。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>高级示例</title>
</head>
<body>
<div id="app">正在加载……</div>
<script src="_framework/blazor.webassembly.js"></script>
</body>
</html>

这里注意两处:

1、要有一个 id 为 app 的元素,它用来呈现组件。

2、<script> 要引用 blazor.webassembly.js 文件。

在 Server 目录下再新建一个文件,名为 app.js。这个用来写服务器主程序(js 代码)。

const url = require("node:url");
const path = require("node:path");
const http = require("node:http");
const fs = require("node:fs"); // 主机
const host = 'localhost';
// 端口
const port = 6748;
// MIME 映射
function getFileMap(fileExt)
{
switch(fileExt)
{
case ".js":
case ".mjs":
return "text/javascript";
case ".json":
return "application/json";
case ".htm":
case ".html":
return "text/html";
case ".css":
return "text/css";
case ".jpg":
case ".jpeg":
return "image/jpeg";
// 其他的自己看情况添加
default:
// 其余的如.dll、.gz等,就是二进制文件
return "application/octet-stream";
}
} http.createServer((request, response)=>
{
// 获取请求路径
let reqPath = url.parse(request.url).pathname;
// 去掉路径开头的“/”
let fileName = reqPath.substring(1);
// 如果空白,默认文件名 index.html
if(fileName.length === 0)
{
fileName = "index.html";
}
// 读取文件内容
fs.readFile(fileName, (err, data)=>{
// 如果出错
if(err)
{
// 直接回个404
response.writeHead(404, {"Content-Type": "text/html"});
}
else
{
// 获取文件扩展名,以决定MIME类型
let ext = path.extname(fileName);
let mimeType = getFileMap(ext.toLowerCase());
// 发送HTTP头
response.writeHead(200, {"Content-Type": mimeType});
// 发送正文
response.write(data);
}
// 这一行必须,结束响应消息
response.end();
});
})
.listen(port, host); console.log(`服务器:${host}:${port}`);

运行它,执行:node app.js。接着在浏览器中输入地址:http://localhost:6748。再验证 Blazor 应用程序是否成功启动。

如果看到随机数能正确生成,说明运行成功了。

【ASP.NET Core】在node.js上托管Blazor WebAssembly应用的更多相关文章

  1. 腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践

    腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践.md 开通腾讯云服务器和Mysql 知识点: ASP.NET Core和 Entity Framework Core的使用 L ...

  2. ASP.NET Core MVC 在linux上的创建及发布

    前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...

  3. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  4. ASP.NET Core 中的文件上传

    ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...

  5. ASP.NET Core 与 Vue.js 服务端渲染

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  6. 深入浅出Node.js(上)

    (一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...

  7. node.js上除了Express还有哪些好用的web开发框架

    老司机都有体会, 开发本身没有多难, 最纠结其实是最初的技术和框架选型, 本没有绝对的好坏之分, 可一旦选择了不适合于自己业务场景的框架, 将来木已成舟后开发和维护成本都很高, 等发现不合适的时候更换 ...

  8. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  9. ASP.NET CORE 之 在IIS上部署MVC项目

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...

  10. 【译】Asp.net core应用在 Kubernetes上内存使用率过高问题分析

    原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps ...

随机推荐

  1. 项目自动备份,oracle 自动备份

    1 项目备份      变量的形式 定时任务不执行就都写成了绝对路径 #!/bin/bash # # 项目路径 /usr/local/tomcat-bjkjdx 备份文件路径/usr/local/ba ...

  2. Windows系统Redis集群搭建

    一.参考网址 https://mp.weixin.qq.com/s/ImdEJTdAmCFJsT55rici0Q 二.Redis版本 注意:搭建windows版的redis集群,redis的版本需要5 ...

  3. webpack1.x 之配置的坑

    一.静态资源目录改变(默认在dist下面) 默认: webpack配置 output: { path: path.join(__dirname, './dist'), filename: 'build ...

  4. 自己制作Switch大气层SDFile

    ️SWITCH SDFILE 每次吃灰之后,就想更新下系统,每次都得研究一遍... 决定好好研究下,发现不是很繁琐. SDFile有哪些文件组成! Atmosphere 任天堂Switch定制固件 H ...

  5. tex基础

    Tex中输入空格以及换行 1. 使用\ 表示空格以及调整空格的大小quad空格    a \qquad b        两个m的宽度quad空格    a \quad b        一个m的宽度 ...

  6. 通过VS Code轻松连接树莓派

    如果您正在使用树莓派作为开发平台,那么通过远程连接VS Code到树莓派是非常方便的一种方法.这样,您可以在Windows或macOS等计算机上开发和测试代码,而不必在树莓派上进行. 以下是通过VS ...

  7. HTML第四章作业

    学生实践4.1.3 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8" ...

  8. activiti引擎的表结构(仅记录用)

    act_hi_*:'hi'表示 history,此前缀的表包含历史数据,如历史(结束)流程实例,变量,任务等等.act_ge_*:'ge'表示 general,此前缀的表为全局通用数据,用于不同场景中 ...

  9. String类型时间与Date时间转换

    1. String类型的时间转为DateTime public static Date transferString2Date(String s) { Date date = new Date(); ...

  10. Pytorch Chain-Rules

    Derivative Rules \[\begin{aligned} &\frac{\delta E}{\delta w^1_{jk}}=\frac{\delta E}{\delta O_k^ ...