簡體   English   中英

異步調用HttpClient以通過Ajax獲取HttpResponseMessage

[英]Calling HttpClient asynchronously to get the HttpResponseMessage via ajax

我實際上是在嘗試使用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');
        }
    });

Web方法調用

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()函數后,它將返回運行模式,並且不會獲取任何內容。 難道我做錯了什么。 如何通過網址檢索響應?

通過[WebMethod]判斷,我猜您正在維護一個非常舊的ASP.NET應用程序。 這里的問題是不兼容的庫。 舊的ASP.NET不支持異步/等待語義,並且HttpClient不支持同步HTTP操作。

最好的選擇是將應用程序升級到支持異步控制器的最新版本,例如ASP.NET Web API或ASP.NET Core。 這樣,您將不必在HTTP調用中阻塞線程。 但是,如果這不是一個選擇,則需要將HttpClient換成實際上支持同步/阻止HTTP的庫。 看一下WebRequest或RestSharp。 如果您繼續使用HttpClient,並且在調用堆棧上的任何地方都有.Result.Wait()調用,那么您不僅會阻塞,而且還會引發死鎖

我對此不夠強調: HttpClient不支持同步HTTP ,因此,如果無法切換到更現代的Web框架,則必須切換到較舊的HTTP庫。

好吧,當我將client.GetAsync()更改為client.GetAsync().Result它起作用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM