![](/img/trans.png)
[英]Blazor app not maintainintg its state on IIS, but works fine on IISExpress
[英]Blazor Webassembly EditForm works on IISExpress but has Problem on IIS
我有一個 Blazor Webassembly 項目,在 iisexpress(visual studio 2019)上運行良好。 但是當我在 IIS 上部署它時,由於以下錯誤,我看不到登錄頁面:
暴擊:Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未處理的異常呈現組件:提供的表達式包含不受支持的 PropertyExpression。 FieldIdentifier 僅支持 object 的簡單成員訪問器(字段、屬性)。 System.ArgumentException:提供的表達式包含不受支持的 PropertyExpression。 FieldIdentifier 僅支持 object 的簡單成員訪問器(字段、屬性)。 at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.ParseAccessor[String](Expression
1, Object&, String& ) at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Create[String](Expression
1 ) at Microsoft.AspNetCore.Components.Forms .InputBase1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].SetParametersAsync(ParameterView ) at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext&, Int32, Int32, Int32, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer, RenderBatchBuilder, Int32, ArrayRange
1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].SetParametersAsync(ParameterView ) at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext&, Int32, Int32, Int32, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer, RenderBatchBuilder, Int32, ArrayRange
1, ArrayRange `1) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue() 的 Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder, RenderFragment)暴擊:Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未處理的異常渲染組件:當前沒有元素與組件 13 關聯錯誤:當前沒有元素與 e.updateComponent 中的組件 13 關聯(https://localhost/ _framework/blazor.webassembly.js:1:31703) 在 t.renderBatch (https://localhost/_framework/blazor.webassembly.js:1:12134) 在 window.Blazor._internal.renderBatch (https://localhost/_internal.renderBatch) _framework/blazor.webassembly.js:1:61913) 在 Object.w [as invokeJSFromDotNet] (https://localhost/_framework/blazor.webassembly.js:1:64435) 在 _mono_wasm_invoke_js_blazor (https://localhost/_framework/ dotnet.5.0.12.js:1:190800) 在 wasm_invoke_iiiiii (wasm://wasm/00aba242:wasm-function[5611]:0xdda7f) 在 ves_pinvoke_method (wasm://wasm/00aba242:wasm-function[5708]: 0xdfb62) 在 interp_exec_method (wasm://wasm/00aba242:wasm-function[2155]:0x44c08) 在 interp_run time_invoke (wasm://wasm/00aba242:wasm-function[7862]:0x12efff) 在 mono_jit_runtime_invoke (wasm://wasm/00aba242:wasm-function[7347]:0x118e5f)
. 當我用純 HTML 輸入替換 EditForm 時,一切正常:這是我的 EditForm:
<EditForm Model="request" OnValidSubmit="OnValid" style="max-width:500px;">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="input-group mb-3">
<InputText class="form-control" @bind-Value="request.Username" placeholder="نام کاربری"></InputText>
<div class="input-group-append">
<span class="fa fa-user input-group-text"></span>
</div>
</div>
<div class="input-group mb-3">
<InputText type="password" class="form-control" @bind-Value="request.Password" placeholder="رمز عبور"></InputText>
<div class="input-group-append">
<span class="fa fa-lock input-group-text"></span>
</div>
</div>
<div class="row">
<!-- /.col -->
<div class="col-4">
<button class="btn btn-primary btn-block btn-flat" disabled="@isDisabled">ورود</button>
</div>
<div class="col-8">
<img src="dist/img/allin-logo.png" width="140" height="100" />
</div>
<!-- /.col -->
</div>
</EditForm>
這是背后的代碼:
[Inject]
public IAccountService accountService { get; set; }
[Inject]
public NavigationManager navigationManager { get; set; }
public AuthenticationRequest request { get; set; }
private string message { get; set; }
private bool isDisabled { get; set; }
public Login()
{
request = new AuthenticationRequest();
message = string.Empty;
isDisabled = false;
}
private async void OnValid()
{
isDisabled = true;
var result = await accountService.LoginAsync(request);
if (result)
{
navigationManager.NavigateTo("/");
}
else
{
isDisabled = false;
message = "نام کاربری یا رمز عبور اشتباه است";
}
}
我應該怎么辦?!
更新:將 void OnValid() 更改為 Task OnValid() 並沒有解決問題。
Blazor Webassembly完全在瀏覽器上運行。 服務器版本或版本根本不起作用。 IIS 或 IIS Express 都沒有問題。
該錯誤使用async void
而不是async Task
。 不能等待帶有async void
簽名的方法。
要修復它, async void OnValid
更改為async Task OnValid
甚至更好的async Task OnValidAsync
:
<EditForm Model="request" OnValidSubmit="OnValid" style="max-width:500px;">
</EditForm>
@code {
private async Task OnValidAsync()
{
isDisabled = true;
var result = await accountService.LoginAsync(request);
...
}
}
async void
簽名僅適用於桌面應用程序(WinForms、WPF)中的異步事件處理程序。 這些框架是在Task
引入之前創建的,不知道如何等待異步方法。
不返回結果的異步方法應使用async Task
簽名。 返回值的方法使用async Task<T>
。
另一方面,Blazor 內置了異步操作。所有 Blazor 示例都使用async Task
代替。 例如:
@page "/set-params-async/{Param?}"
<p>@message</p>
@code {
private string message = "Not set";
[Parameter]
public string? Param { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
if (parameters.TryGetValue<string>(nameof(Param), out var value))
{
if (value is null)
{
message = "The value of 'Param' is null.";
}
else
{
message = $"The value of 'Param' is {value}.";
}
}
await base.SetParametersAsync(parameters);
}
}
sdk 版本之間存在不匹配。 項目使用 .net 5.0 構建,但 .net 運行時為 .net 6.0.1。 通過卸載 .net 6,一切正常! 感謝您的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.