我正在开发一个应用程序,它应该在自定义传输协议上运行,该协议与http非常相似,但在查询字符串的开头有一个package://前缀而不是http://。因此,对名为index.html的资源的查询将类似于package://resources/index.html。
我想在这个环境中部署Blazor WebAssembly应用程序。问题是,一旦Blazor的index.html被加载,它就会加载blazor.webassembly.js,后者使用fetch()来加载blazor.boot.json。然而,fetch()似乎只适用于http和https (不确定原因),我得到了这个错误:
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在一个应用程序中工作,该应用程序运行在一个协议上,该协议不是http或https,但除了方案命名之外非常相似。
发布于 2021-07-16 12:25:38
简而言之,这是不可能的。毕竟,每个浏览器都是一个HTTP客户端。虽然一些浏览器已经为特殊目的采用了其他协议,如用于web会议的RTC,但它们不支持开箱即用的自定义协议。可能有一种方法可以编写浏览器扩展,使其能够使用package://。或者,您可以通过操纵浏览器首选项或OS值,“诱使”浏览器对以"package://“开头的URI进行HTTP(s)调用。但同样需要您为每台应该执行您的应用程序的机器执行此操作。
第二个可能的问题存在于WASM应用程序中。如果WASM应用程序想要与另一个服务交互,您通常会使用HttpClient实例。Blazor WASM提供了一个处理程序,该处理程序使用浏览器fetch API进行这些调用。因为WASM应用程序在特殊的沙箱模式下运行,所以您不能像在普通.NET应用程序中那样访问所有系统级特性,包括(但不限于)套接字。因此,您也不能在这里实现客户传输协议。
如果您仍然希望使用Blazor应用程序并使用您的自定义协议进行“内部”通信,Blazor Server端可能是一个选择。在那里,您可以实现自己的传输协议(使用套接字和所有.NET类/库),同时使用标准技术与浏览器进行交互。
https://stackoverflow.com/questions/68402754
复制相似问题