【问题标题】:Razor Component Call to HttpClient Not respondingRazor 组件调用 HttpClient 没有响应
【发布时间】:2021-03-03 10:09:44
【问题描述】:

我试图在 Razor 组件中的操作期间调用注入的 HttpClient。当我在 OnInitialized 期间这样做时,返回符合预期。当我对输入更改等事件执行此操作时,客户端调用没有响应。 我在 .Net Core 3.1 中混合使用了 MVC 控制器/视图和 Razor 组件。

Startup.cs

services.AddControllersWithViews()...
services.AddRazorPages()...

services.AddHttpClient<IJiraService, JiraService>("jira", c =>
            {
                c.BaseAddress = new Uri(Configuration.GetSection("ApplicationSettings:Jira:Url").Value);
                var auth =
                    $"{Configuration.GetSection("ApplicationSettings:Jira:UserName").Value}:{Configuration.GetSection("ApplicationSettings:Jira:Password").Value}";
                var authHeaderValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth));

                c.DefaultRequestHeaders.AddAuthorization("Basic", authHeaderValue);
                c.Timeout = TimeSpan.FromSeconds(20);
                c.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue
                {
                    NoCache = true
                };
            });

ChildComponent.razor

@inject IJiraService JiraService

@code {
    public int SelectedReleaseId
    {
        get => ReleaseModel.SelectedReleaseId;
        set
        {
            ReleaseModel.SelectedReleaseId = value;
            ReleaseChanged().Wait();
        }
    }
}

@functions
{
    private async Task ReleaseChanged()
    {
        if (ReleaseModel.SelectedReleaseId > 0)
        {
            var url = "...";

            await JiraService.GetResponseAsync(url);
        }
    }

JiraService.cs

public async Task<string> GetResponseAsync(string url)
        {
            var resp = await httpClient.GetAsync(url); // <--- this is the call that never returns when invoked from an input control event
            var respContentString = await resp.Content.ReadAsStringAsync();
            if (resp.StatusCode != HttpStatusCode.OK)
            {
                throw new HttpOperationException(
                    $"Invalid response from Jira service: {resp.StatusCode}: {respContentString}");
            }

            return respContentString;
        }

两者之间实际上有一些服务分类,但这就是要点。 我已经将调用抽象到父组件并实现了 EventCallbacks,所有这些都具有相同的结果。 JiraService 中的底层调用被命中,我在await httpClient.GetAsync(url); 上看到一个断点停止,但随后执行就进入了以太。甚至没有抛出异常或超时。

【问题讨论】:

  • 当你调用“await httpClient.GetAsync(url);”时你期望发生什么,结果字符串似乎没有分配给任何东西
  • 还有为什么你的例子有一个代码块和一个功能块你应该只需要一个代码块。 functions 是 Blazor 正式发布之前代码块的旧名称,functions 块已更改为代码块,它仍然适用于向后兼容,但不是规范
  • @DavidMasterson,GetAsync() 将从其内容中返回一个 json 字符串。请参阅内容resp.Content.ReadAsStringAsync(); 为什么我使用函数和代码的后续行,除了无知之外没有其他原因。我找到了两者的例子,但没有看到结果有实质性差异。

标签: razor blazor


【解决方案1】:

现在一切似乎都那么明显。问题是僵局。 This old post 帮助我意识到我的基于属性的 @bind 属性正在同步调用到 async/await 图中。我将其重构为 @onchange 函数,该函数通过调用堆栈和 viola 启用适当的 async/await 行为,await httpClient.GetAsync() 的行为就像它应该的那样。

@bind 行为有点恼火,除了属性值之外,它还采用 onchange 事件功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多