【发布时间】: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();为什么我使用函数和代码的后续行,除了无知之外没有其他原因。我找到了两者的例子,但没有看到结果有实质性差异。