繁体   English   中英

从应用程序调用Web API

[英]Call Web API From Application

我通过单击按钮从ASP.NET页面调用Web API,如下所示。 这是完全工作正常,虽然我已经读的地方会造成死锁因为它不是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);
        }
    }
}

如果您不想使用async,那么您可以使用WebClient而不是HttpClient。

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

您可以将该方法重写为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); ,我不知道你是否会看到性能有显着改善。

您可以尝试使用此方法

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方法,其中包含在应用程序本身或任何外部Web请求中配置的基本URL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM