【问题标题】:how to make HTTP GET specific data in Blazor?如何在 Blazor 中制作 HTTP GET 特定数据?
【发布时间】:2021-07-01 03:44:40
【问题描述】:

我创建了一个控制器 HttpGet 来获取特定的用户数据,但是当我在客户端调用 API 时,它没有显示结果。

控制器

[HttpGet("{Id}/{Username}")]
public ApplicationUser Details(string Id, string Username)
{
  return _dataAccessProvider.GetAspNetUsersSingleRecord(Id, Username);
}

HttpGet的客户端调用API

@code {
    private UserProfile[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetFromJsonAsync<UserProfile[]>("Authentication/ed131c76-4a3a-4626-aec5-3db534f14a30/amrita");
    }
}

GetAspNetUsersSingleRecord

public ApplicationUser GetAspNetUsersSingleRecord(string Id, string Username)
{
     return _context.applicationUser.FirstOrDefault(t => t.Id == Id &&  t.UserName == Username);
}

遇到这个错误

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常呈现组件:无法将 JSON 值转换为 BlazorWebAssemblyFrontEnd.Pages.UserProfile[]。 路径:$ |行号:0 |字节位置内线:1。 System.Text.Json.JsonException:无法转换 JSON 值 到 BlazorWebAssemblyFrontEnd.Pages.UserProfile[]。路径:$ | 行号:0 | BytePositionInLine: 1. 在 System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue (System.Type propertyType) in :0 at System.Text.Json.Serialization.Converters.IEnumerableDefaultConverter2[TCollection,TElement].OnTryRead (System.Text.Json.Utf8JsonReader&amp; reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options, System.Text.Json.ReadStack&amp; state, TCollection&amp; value) &lt;0x3005988 + 0x001de&gt; in &lt;filename unknown&gt;:0 at System.Text.Json.Serialization.JsonConverter1[T].TryRead (System.Text.Json.Utf8JsonReader& 阅读器,System.Type typeToConvert, System.Text.Json.JsonSerializerOptions 选项, System.Text.Json.ReadStack& 状态,T& 值) in :0 在 System.Text.Json.Serialization.JsonConverter1[T].ReadCore (System.Text.Json.Utf8JsonReader&amp; reader, System.Text.Json.JsonSerializerOptions options, System.Text.Json.ReadStack&amp; state) &lt;0x30048a8 + 0x00292&gt; in &lt;filename unknown&gt;:0 at System.Text.Json.JsonSerializer.ReadCore[TValue] (System.Text.Json.Serialization.JsonConverter jsonConverter, System.Text.Json.Utf8JsonReader&amp; reader, System.Text.Json.JsonSerializerOptions options, System.Text.Json.ReadStack&amp; state) &lt;0x2ff9b20 + 0x0002a&gt; in &lt;filename unknown&gt;:0 at System.Text.Json.JsonSerializer.ReadCore[TValue] (System.Text.Json.JsonReaderState&amp; readerState, System.Boolean isFinalBlock, System.ReadOnlySpan1[T] 缓冲区, System.Text.Json.JsonSerializerOptions 选项, System.Text.Json.ReadStack& 状态, System.Text.Json.Serialization.JsonConverter converterBase)

  • 0x00058> 在 System.Text.Json.JsonSerializer.ReadAsync[TValue] (System.IO.Stream utf8Json, System.Type returnType, System.Text.Json.JsonSerializerOptions 选项, System.Threading.CancellationToken cancelToken) 在 :0 处 System.Threading.Tasks.ValueTask1[TResult].get_Result () &lt;0x309b428 + 0x00034&gt; in &lt;filename unknown&gt;:0 at System.Net.Http.Json.HttpContentJsonExtensions.ReadFromJsonAsyncCore[T] (System.Net.Http.HttpContent content, System.Text.Encoding sourceEncoding, System.Text.Json.JsonSerializerOptions options, System.Threading.CancellationToken cancellationToken) &lt;0x2fedb48 + 0x00218&gt; in &lt;filename unknown&gt;:0 at System.Net.Http.Json.HttpClientJsonExtensions.GetFromJsonAsyncCore[T] (System.Threading.Tasks.Task1[TResult] 任务响应, System.Text.Json.JsonSerializerOptions 选项, System.Threading.CancellationToken cancelToken) 在 :0 处 BlazorWebAssemblyFrontEnd.Pages.Profile.OnInitializedAsync () [0x00033] 在 C:\Users\yaps\source\repos\BlazorWebAssemblyFrontEnd\Pages\Profile.razor:44 在 Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync () 在 :0 处 Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (System.Threading.Tasks.Task taskToHandle) 在 :0

【问题讨论】:

    标签: asp.net-web-api http-get blazor-webassembly


    【解决方案1】:

    客户端期望来自服务器的另一个响应。客户端期望一个数组(一个排序列表),而服务器端返回一个对象。

    我希望这样:

    private UserProfile forecasts;
    
    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetFromJsonAsync<UserProfile>("Authentication/ed131c76-4a3a-4626-aec5-3db534f14a30/amrita");
    }
    

    属性需要匹配才能获取UserProfile对象中的数据。否则有些属性会是空的。

    一个好的做法是与客户端和服务器端创建一个共享项目,其中包含可能的响应和请求。那么你应该有更少的机会得到不匹配。

    【讨论】:

    • 顺便说一句:如果您使用 Entity 框架中的 ApplicationUser,那么您不应该返回 ApplicationUser。因为在ApplicationUser中,有一个password字段,里面有密码的hash。您永远不会将密码的哈希值返回给客户端。但我看不到您在 ApplicationUser 中有哪些属性。所以,我无法判断。
    • 嗨 Oscar,我正在使用 IdentityUser 作为 ApplicationUser。
    • 嗨叶雨。我的评论更多的是建议。但是您的解决方案在我的回答中。我希望你能解决它。
    • 感谢您的回答和建议,谢谢!目前,我正在通过从不同项目调用 Web API 来执行 Blazor WebAssembly PWA。 API 由 .NET Core 构建,充当服务器端。我对此完全陌生,并且仍在学习它。
    • 您对登录有什么建议吗?我需要使用HttpClient进行登录还是有其他方式..
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2012-12-05
    相关资源
    最近更新 更多