【问题标题】:Use Blazor with non-http(s) protocol将 Blazor 与非 http(s) 协议一起使用
【发布时间】:2021-07-16 02:34:01
【问题描述】:

我正在开发一个应该通过自定义传输协议运行的应用程序,该协议与 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 但除了方案命名之外非常相似的协议上运行的应用程序中工作。

【问题讨论】:

    标签: javascript c# .net blazor blazor-webassembly


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2018-04-24
      • 2019-04-11
      • 2013-01-20
      • 2021-12-04
      • 2015-08-03
      相关资源
      最近更新 更多