如何在Blazor中同步调用HttpClient

如何在Blazor中同步调用HttpClient,blazor,webassembly,Blazor,Webassembly,我想在Blazor中同步调用API,但它不起作用。是否有一种同步调用API的方法。请查找下面的代码 当前正在使用异步调用,如下所述: if(HttpClient==null) { HttpClient=新的HttpClient(); HttpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,userContext.Token); } var json=JsonConvert.Serialize

我想在Blazor中同步调用API,但它不起作用。是否有一种同步调用API的方法。请查找下面的代码

当前正在使用异步调用,如下所述:

if(HttpClient==null)
{
HttpClient=新的HttpClient();
HttpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,userContext.Token);
}
var json=JsonConvert.SerializeObject(请求);
HttpContent=newstringcontent(json,Encoding.UTF8,“application/json”);
var httpResponse=等待HttpClient.PostAsync(api,内容);
httpResponse.EnsureAccessStatusCode();
var response=wait-httpResponse.Content.ReadAsStringAsync();
var parsedResult=JObject.Parse(响应);
return parsedResult[“returnObj”].ToString();
尝试了以下方式,但Blazor不支持:

字符串响应;
WebRequest WebRequest=WebRequest.Create($“{userContext.ServerAddress}/Erp.BO.ConfigurationRuntimeSvc/{apiName}”);
webRequest.Method=“POST”;
添加(“授权”、“基本”+userContext.Token);
webRequest.ContentType=“应用程序/json”;
//创建POST数据并将其转换为字节数组。
var json=JsonConvert.SerializeObject(请求);
使用(var streamWriter=newstreamwriter(webRequest.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
}
var httpResponse=(HttpWebResponse)webRequest.GetResponse();
使用(var streamReader=newstreamreader(httpResponse.GetResponseStream())
{
response=streamReader.ReadToEnd();
}
var parsedResult=JObject.Parse(响应);
return parsedResult[“returnObj”].ToString();

请提供解决方案

我不知道这是否对您有帮助,但不久前在Github上有人问过类似的问题:

编辑:

文章摘要:

基本上,您不应该执行同步Http调用。 首选选项:
var result=await-HttpClient.GetJsonAsync(myUrl)

如果您真的想同步,这就是解决方案:

如果需要,可以在启动渲染器之前运行异步操作。比如说,

static void Main(字符串[]args)
{
Task.Run(异步()=>
{
var serviceProvider=新浏览器serviceProvider(服务=>
{
//在此处添加任何自定义服务
});
//首先运行一个异步HTTP请求
var httpClient=serviceProvider.GetService();
var data=wait-httpClient.GetStringAsync(“/api/SampleData/WeatherForecasts”);
Console.WriteLine(“获取的数据:+数据”);
//现在请求已完成,开始呈现UI
新浏览器渲染器(serviceProvider).AddComponent(“应用程序”);
});
}
这是首选解决方案,而不是试图阻止UI 线程(浏览器不允许的-他们会说标签崩溃了) 如果您正在阻止UI线程)