异步调用HttpClient以通过ajax获取HttpResponseMessage

时间:2018-02-22 08:39:45

标签: c# jquery .net dotnet-httpclient httpresponsemessage

我实际上是尝试使用 HTTPClient 类通过URL获取数据。我通过ajax电话打电话。但是,当获取响应时,它将从调试模式返回到运行模式,并且没有任何反应。没有检索到任何响应。以下是代码:

的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 Call

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()函数,它就会返回运行模式并且不会获取任何内容。难道我做错了什么。如何通过网址检索响应?

2 个答案:

答案 0 :(得分:1)

根据[WebMethod]判断,我猜你正在维护非常旧的ASP.NET应用程序。这里的问题是不兼容的库。旧ASP.NET不支持async / await语义,HttpClient不支持同步HTTP操作。

您最好的选择是将应用程序升级为支持异步控制器的更现代的应用程序,例如ASP.NET Web API或ASP.NET Core。这样您就不必在HTTP调用上阻塞线程。但是如果这不是一个选项,则需要将HttpClient换成实际支持同步/阻塞HTTP的库。看看WebRequest或RestSharp。如果您继续使用HttpClient并且调用堆栈中的.Result.Wait()调用任何地方,那么您不仅要阻止,而且还要inviting deadlocks

我无法强调这一点: HttpClient不支持同步HTTP ,因此如果您无法切换到更现代的Web框架,则必须切换到较旧的HTTP库。

答案 1 :(得分:0)

好吧,当我将client.GetAsync()更改为client.GetAsync().Result时就可以了。