通过 ajax 异步调用 HttpClient 获取 HttpResponseMessage
Calling HttpClient asynchronously to get the HttpResponseMessage via ajax
我实际上是在尝试使用 HTTPClient class 通过 URL 获取数据。我正在通过 ajax 呼叫。但是,当获取响应时,它会从调试模式返回 运行ning 模式,并且没有任何反应。未检索到任何响应。下面是代码:
jQuery
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "../../Services/AService.asmx/GetCompanyInformation",
data: { id: JSON.stringify(id) },
contentType: "application/json; charset=utf-8",
dataType: "json",
async:true,
success: function (res) {
var options = JSON.parse(res.d);
},
error: function (errormsg) {
$(".dropdown_SubDomainLoading").hide();
toastr.options.timeOut = 7000;
toastr.options.closeButton = true;
toastr.error('Something Went Wrong');
}
});
WebMethod 调用
public static string CompanyDetails;
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string GetCompanyInformation(string id)
{
string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
string url = string.Empty;
url = GetCompanyDetailsForApps(id);
RunAsync(url).Wait();
return CompanyDetails;
}
static async Task RunAsync(string Url)
{
string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Authorization", authorizationKey);
HttpResponseMessage response = await client.GetAsync(Url);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
//UrlMetricsResponse mozResonse = JsonConvert.DeserializeObject<UrlMetricsResponse>(content);
dynamic dynObj = JsonConvert.DeserializeObject(content);
CompanyDetails = JsonConvert.SerializeObject(dynObj);
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR :" + ex.Message);
}
}
一旦调用 client.GetAsync() 函数,它就会返回到 运行 模式,并且不会获取任何内容。难道我做错了什么。如何通过 url?
检索响应
好吧,当我将 client.GetAsync()
更改为 client.GetAsync().Result
时,它起作用了。
根据 [WebMethod]
判断,我猜您正在维护一个 非常 旧的 ASP.NET 应用程序。这里的问题是不兼容的库。旧 ASP.NET 不支持 async/await 语义,HttpClient
不支持同步 HTTP 操作。
您最好的选择是将应用程序升级到支持异步控制器的更现代的东西,例如 ASP.NET Web API 或 ASP.NET Core。这样您就不必在 HTTP 调用上阻塞线程。但如果这不是一个选项,您需要将 HttpClient 换成一个实际上 支持 synchronous/blocking HTTP 的库。看看 WebRequest or RestSharp. If you continue to use HttpClient and there are .Result
or .Wait()
calls anywhere on the call stack, you're not only blocking but you are inviting deadlocks.
我怎么强调都不为过:HttpClient 不支持同步 HTTP,所以如果你不能切换到更现代的 Web 框架,你必须切换到更旧的HTTP 库。
我实际上是在尝试使用 HTTPClient class 通过 URL 获取数据。我正在通过 ajax 呼叫。但是,当获取响应时,它会从调试模式返回 运行ning 模式,并且没有任何反应。未检索到任何响应。下面是代码:
jQuery
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "../../Services/AService.asmx/GetCompanyInformation",
data: { id: JSON.stringify(id) },
contentType: "application/json; charset=utf-8",
dataType: "json",
async:true,
success: function (res) {
var options = JSON.parse(res.d);
},
error: function (errormsg) {
$(".dropdown_SubDomainLoading").hide();
toastr.options.timeOut = 7000;
toastr.options.closeButton = true;
toastr.error('Something Went Wrong');
}
});
WebMethod 调用
public static string CompanyDetails;
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string GetCompanyInformation(string id)
{
string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
string url = string.Empty;
url = GetCompanyDetailsForApps(id);
RunAsync(url).Wait();
return CompanyDetails;
}
static async Task RunAsync(string Url)
{
string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Authorization", authorizationKey);
HttpResponseMessage response = await client.GetAsync(Url);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
//UrlMetricsResponse mozResonse = JsonConvert.DeserializeObject<UrlMetricsResponse>(content);
dynamic dynObj = JsonConvert.DeserializeObject(content);
CompanyDetails = JsonConvert.SerializeObject(dynObj);
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR :" + ex.Message);
}
}
一旦调用 client.GetAsync() 函数,它就会返回到 运行 模式,并且不会获取任何内容。难道我做错了什么。如何通过 url?
检索响应好吧,当我将 client.GetAsync()
更改为 client.GetAsync().Result
时,它起作用了。
根据 [WebMethod]
判断,我猜您正在维护一个 非常 旧的 ASP.NET 应用程序。这里的问题是不兼容的库。旧 ASP.NET 不支持 async/await 语义,HttpClient
不支持同步 HTTP 操作。
您最好的选择是将应用程序升级到支持异步控制器的更现代的东西,例如 ASP.NET Web API 或 ASP.NET Core。这样您就不必在 HTTP 调用上阻塞线程。但如果这不是一个选项,您需要将 HttpClient 换成一个实际上 支持 synchronous/blocking HTTP 的库。看看 WebRequest or RestSharp. If you continue to use HttpClient and there are .Result
or .Wait()
calls anywhere on the call stack, you're not only blocking but you are inviting deadlocks.
我怎么强调都不为过:HttpClient 不支持同步 HTTP,所以如果你不能切换到更现代的 Web 框架,你必须切换到更旧的HTTP 库。