无法在 Uno Platform WebAssembly 中创建 GrpcChannel (System.NullReferenceException)

Tom*_*Tom 1 c# webassembly grpc-web uno-platform blazor-webassembly

我正在尝试使用gRPC-Web制作Uno Platform的示例。

因此我从这篇文章提供的内容中得到了启发。我按照文章的说明创建了一个BlazorApp,它使用gRPC-Web 的天气服务。之后,我还添加了另一个服务,即计数器服务,如gRPC-Web 示例中所示。

一切正常后,我添加了一个Uno Platform WebAssembly应用程序来替换BlazorApp客户端。

当前问题:

当尝试创建应用程序时,GrpcChannel应用程序会获得一个System.NullReferenceException.

创建通道的代码片段如下所示:

var baseUri = "https://localhost:44366";
var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions());
Run Code Online (Sandbox Code Playgroud)

这与BlazorApp中使用的代码完全相同。

BlazorAppUno Platform WebAssembly的示例代码可以在此存储库中找到。

任何想法/建议/帮助将不胜感激。

Car*_*lly 5

好的,我分析了你的代码,发现你的代码有4个问题:

  1. 您使用的是 Blazor IoC 容器。Uno 的设计目的不是开箱即用。有一些方法可以使用容器,但还有更多工作要做。为了解决这个问题,我只是将 gRPC 服务初始化移至其中MainPage.xaml.cs。这不是生产质量,但它可以用于演示 gRPC 的目的。
  2. 您正在调用SYNC版本.IncrementCount()。这在 WASM 上是不可能的,因为不可能阻塞WASM 中的主线程(实际上,这是可能的,但您需要使用隐藏在 JavaScript 深处的原语,无论如何它都不会解决您的问题)。这就是为什么在 Blazor 上您需要调用.IncrementCountAsync(). WASM 上也存在相同的要求。
  3. 您的页面的 XAML 使用的是<Grid>没有任何rows 的元素,因此每个元素都是一个一个地绘制的。我将其替换为 a<StackPanel>以获得更好的结果。
  4. 需要在服务器上激活 CORS,因为主机名 + 端口略有不同。

我在你的项目的一个 Fork 上发布了一个工作版本,它可以工作!