经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
【ASP.NET Core】在node.js上托管Blazor WebAssembly应用
来源:cnblogs  作者:东邪独孤  时间:2023/3/22 9:25:18  对本文有异议

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

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

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

  1. dotnet new blazorwasm-empty -n Demo -o .

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

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

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

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

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

  1. @page "/"
  2.  
  3. <h1>Hello, world!</h1>
  4. <button @onclick="ClickMe">点这里中大奖</button>
  5. <div>@Message</div>
  6. @code{
  7. private string? Message{get;set;}
  8. void ClickMe()
  9. {
  10. int xx = Random.Shared.Next(100, 700);
  11. Message = $"恭喜你获得{xx}万假钞!";
  12. }
  13. }

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

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

 

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

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

执行发布命令。

  1. dotnet publish -c PublishRelease

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

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

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

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8"/>
  5. <title>高级示例</title>
  6. </head>
  7. <body>
  8. <div id="app">正在加载……</div>
  9. <script src="_framework/blazor.webassembly.js"></script>
  10. </body>
  11. </html>

这里注意两处:

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

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

 

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

  1. const url = require("node:url");
  2. const path = require("node:path");
  3. const http = require("node:http");
  4. const fs = require("node:fs");
  5. // 主机
  6. const host = 'localhost';
  7. // 端口
  8. const port = 6748;
  9. // MIME 映射
  10. function getFileMap(fileExt)
  11. {
  12. switch(fileExt)
  13. {
  14. case ".js":
  15. case ".mjs":
  16. return "text/javascript";
  17. case ".json":
  18. return "application/json";
  19. case ".htm":
  20. case ".html":
  21. return "text/html";
  22. case ".css":
  23. return "text/css";
  24. case ".jpg":
  25. case ".jpeg":
  26. return "image/jpeg";
  27. // 其他的自己看情况添加
  28. default:
  29. // 其余的如.dll、.gz等,就是二进制文件
  30. return "application/octet-stream";
  31. }
  32. }
  33. http.createServer((request, response)=>
  34. {
  35. // 获取请求路径
  36. let reqPath = url.parse(request.url).pathname;
  37. // 去掉路径开头的“/”
  38. let fileName = reqPath.substring(1);
  39. // 如果空白,默认文件名 index.html
  40. if(fileName.length === 0)
  41. {
  42. fileName = "index.html";
  43. }
  44. // 读取文件内容
  45. fs.readFile(fileName, (err, data)=>{
  46. // 如果出错
  47. if(err)
  48. {
  49. // 直接回个404
  50. response.writeHead(404, {"Content-Type": "text/html"});
  51. }
  52. else
  53. {
  54. // 获取文件扩展名,以决定MIME类型
  55. let ext = path.extname(fileName);
  56. let mimeType = getFileMap(ext.toLowerCase());
  57. // 发送HTTP头
  58. response.writeHead(200, {"Content-Type": mimeType});
  59. // 发送正文
  60. response.write(data);
  61. }
  62. // 这一行必须,结束响应消息
  63. response.end();
  64. });
  65. })
  66. .listen(port, host);
  67. console.log(`服务器:${host}:${port}`);

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

 

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

 

原文链接:https://www.cnblogs.com/tcjiaan/p/17241935.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号