我正在用。net 6编写Blazor WASM应用程序。
应用程序的工作,因为它应该在Debug
从Visual Studio 2022运行时,但当我部署它作为一个静态站点使用dotnet publish -c Release --nologo
和访问bin/Release/net6.0/publish/wwwroot
文件夹在localhost
我得到以下错误:
Unhandled exception rendering component: Cannot provide a value for property 'ScopeFactory' on type 'MySolution.Pages.MyComponent' because the property has no setter.
我的组件是这样的:
public class MyComponent : OwningComponentBase
{
public IOptions Option { get; set; } = Options.Default;
protected override async Task OnInitializedAsync()
{
Options = await ScopedServices.GetRequiredService<Task<IOptions>>();
}
}
我在Program.cs
中添加了这样的服务
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<Task<IOptions>>(async op => await Options.Create(op.GetRequiredService<HttpClient>()));
和Options.Create()
看起来像这样
public static async Task<IGameOptions> Create(HttpClient client)
{
var json = await client.GetStringAsync("/gameOptions.json");
var options = JsonConvert.DeserializeObject<Options>(json);
if (options is null)
{
throw new InvalidDataException("Given path contains invalid JSON object.");
}
return options;
}
我已经做了大量的测试和搜索,但我找不到任何东西。我试图只请求HttpClient
服务在我的组件,但即使抛出相同的错误。
我看到这是DI中的一些问题,但我使用OwningComponentBase
管理DI范围,正如ASP中所述。. NET Core Blazor依赖注入。
是什么引起的?
提前谢谢你
感谢您在评论中发布实际代码。看了之后,这看起来像是修剪的结果。
尝试添加<PublishTrimmed>false</PublishTrimmed>
到您的项目文件,我认为它会工作。
基本上,当您运行命令dotnet publish -c Release --nologo
时,它正在优化程序集的大小(修剪)。在您的情况下,它似乎正在更改OwningComponentBase中的以下代码:
[Inject] IServiceScopeFactory ScopeFactory { get; set; }
:
[Inject] IServiceScopeFactory ScopeFactory { get; }
。在修剪过程中去除setter
我认为这是实现
的一个bug标记的答案只能在你不想在发布时修改应用程序的情况下使用,这并不总是可取的。如果您想发布带有微调的内容,则必须从微调中排除该类型。
<assembly fullname="Microsoft.AspNetCore.Components">
<type fullname="Microsoft.AspNetCore.Components.OwningComponentBase" preserve="all" />
</assembly>
因为整个修剪的东西本身就是一个主题,我可以推荐这个页面作为调整修剪过程的开始:.Net博客-自定义修剪这篇博文是为。net 5写的,但我也在用。net 6。
我尝试了这篇文章中给出的两个答案,并希望分享我的发现,万一它们能帮助到别人。
Jesse Good的答案解决了这个问题,但给了我其他与性能相关的问题。它还使构建的时间长度增加了一倍。Steffan Ossendorf的答案对我来说也很有效,尽管需要稍微多做一些修改和额外的文件,但绝对值得付出额外的努力。
如果它对任何人有帮助,这就是我在阅读了Steffan提到的关于修剪的文章后所做的。
我创建了一个新的XML文件" trim . XML "在我的Blazor项目的路线中,包含以下内容-
<linker>
<assembly fullname="Microsoft.AspNetCore.Components">
<type fullname="Microsoft.AspNetCore.Components.OwningComponentBase" preserve="all" />
</assembly>
</linker>
然后我将它添加到我的Blazor项目的.csproj文件中-
<ItemGroup>
<TrimmerRootDescriptor Include="Trimmer.xml" />
</ItemGroup>