将 Blazor 与非 http(s) 协议配合使用



我正在开发一个应用程序,该应用程序应该在自定义传输协议上运行,该协议与http几乎相同,但在查询字符串的开头具有package://前缀而不是http://。因此,对名为index.html的资源的查询看起来像package://resources/index.html

我想将 Blazor WebAssembly 应用程序部署到此环境中。问题是,一旦加载了 Blazor 的index.html- 它就会加载blazor.webassembly.js它使用fetch()加载blazor.boot.json.但是,fetch()似乎只适用于httphttps(不知道为什么),我收到此错误:

blazor.webassembly.js:1 Fetch API cannot load package://package_name/wwwroot/_framework/blazor.boot.json. 
URL scheme "package" is not supported.
(anonymous) @ blazor.webassembly.js:1
blazor.webassembly.js:1 TypeError: Failed to fetch
at Function.<anonymous> (blazor.webassembly.js:1)
at blazor.webassembly.js:1
at Object.next (blazor.webassembly.js:1)
at blazor.webassembly.js:1
at new Promise (<anonymous>)
at blazor.webassembly.js:1
at Function.initAsync (blazor.webassembly.js:1)
at blazor.webassembly.js:1
at blazor.webassembly.js:1
at Object.next (blazor.webassembly.js:1) 

我在想也许用一个在里面使用XMLHttpRequest的函数覆盖fetch会有所帮助,但我不确定这在 js 中是否可行。总的来说,我想知道如何使 Blazor 在通过不httphttps但除方案命名外非常相似的协议上运行的应用程序中工作。

简短的回答是这是不可能的。毕竟,每个浏览器都是一个HTTP客户端。虽然一些浏览器已采用其他协议用于特殊目的,例如用于网络会议的 RTC,但它们无法支持开箱即用的自定义协议。可能有一种方法可以编写浏览器扩展,以便使用 package://。或者,您找到一种方法来"诱骗"浏览器通过操纵浏览器首选项或操作系统值对以"package://"开头的 URI 进行 HTTP(s) 调用。但同样,它要求您为应执行应用程序的每台计算机执行此操作。

第二个可能的问题在于 WASM 应用程序。如果 WASM 应用程序想要与其他服务(如 API)进行交互,您通常会使用HttpClient实例。Blazor WASM 提供了一个处理程序,该处理程序使用浏览器fetch API进行这些调用。由于 WASM 应用程序在特殊的沙盒模式下运行,因此您无法像在普通 .NET 应用程序中那样访问所有系统级功能,包括(但不限于)套接字。因此,您也不能在此处实现客户传输协议。

如果仍希望拥有 Blazor 应用程序并使用自定义协议进行"内部"通信,则可以选择 Blazor 服务器端。在那里,您可以实现自己的传输协议(使用套接字和所有 .NET 类/库),同时使用标准技术与浏览器进行交互。

最新更新