Вызов 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);
, и я не знаю, увидите ли вы значительное улучшение производительности тогда.