Вызов Web API из приложения

Я вызвал веб-API из ASP.NET страница на кнопке нажмите, как показано ниже. Это отлично работает, хотя я где-то читал, что это создаст тупик, поскольку это не async (из-за использования .Result в строке client.PostAsJsonAsync(url, sd).Result;)

пожалуйста, предложите лучший способ, чтобы обновить этот код.

private void CallApi(SurveyData sd)
{

    using (var client = new HttpClient())
    {                

        string url = ConfigurationManager.AppSettings.Get("url");
        client.DefaultRequestHeaders.Accept.Clear();

        var response = client.PostAsJsonAsync(url, sd).Result;

        if (response.IsSuccessStatusCode) 
        { 
            Response.Write("Success");
        }
        else
        {
            Response.Write(response.StatusCode + " : Message - " + response.ReasonPhrase);
        }
    }
}

3 ответов


Если вы не хотите использовать async, вы можете использовать WebClient вместо HttpClient.

WebClient client = new WebClient();
string response = client.UploadString(RequestUrl, "POST", data);

вы можете попробовать этот метод

public async Task<HttpResponseMessage> GetHttpClientResult<T>(string baseUrl, string url, T requestParam, bool isExternalLink = false,
          string acceptMediaVerb = "application/json", HttpMethod requestMethod = null)
        {
            try
            {
                HttpClient client = new HttpClient();
                HttpResponseMessage response = new HttpResponseMessage();
                if (!isExternalLink)
                {
                    client.BaseAddress = new Uri(baseUrl);
                }
                if (!string.IsNullOrEmpty(acceptMediaVerb))
                {
                    if (acceptMediaVerb == "application/json")
                    {
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        if (requestMethod == HttpMethod.Get || requestMethod == null)
                        {
                            response = client.GetAsync(url).Result;
                        }
                        else if (requestMethod == HttpMethod.Post)
                        {
                            response = await client.PostAsJsonAsync(url, requestParam);
                        }
                    }
                }
                var context = new HttpContextWrapper(HttpContext.Current);
                HttpRequestBase request = context.Request;
                return response;
            }
            catch
            {
                return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
            }
        }

Это начинает писать как общий метод для обработки методов api с базовым url-адресом, настроенным в самом приложении или любом внешнем веб-запросе


вы можете переписать метод как async метод (в этом случае я бы предложил предоставить тип возврата string):

private async Task<string> CallApi(SurveyData sd)
{

    string result = String.Empty;

    using (var client = new HttpClient())
    {

        string url = ConfigurationManager.AppSettings["url"];
        client.DefaultRequestHeaders.Accept.Clear();

        var response = await client.PostAsJsonAsync(url, sd);

        if (response.IsSuccessStatusCode)
        {
            result = "Success";
        }
        else
        {
            result = response.StatusCode + " : Message - " + response.ReasonPhrase;
        }
    }

    return result;
}

тогда вы также можете await результаты этого вызова:

Response.Write(await CallApi(sd));

хотя вызов должен быть из другой async метод. В противном случае вам придется сделать Response.Write(CallApi(sd).Result);, и я не знаю, увидите ли вы значительное улучшение производительности тогда.