在同步方法中调用异步web api方法抛出错误

时间:2015-06-24 13:39:06

标签: c# asp.net asynchronous

我从同步方法调用来自C#ASP.Net Web应用程序的异步Web api。我收到错误。 发生了一个或多个错误。发送请求时发生错误。 底层连接已关闭:接收时发生意外错误。 无法从传输连接读取数据:远程主机强制关闭现有连接。

如果我使用异步方法从Windows窗体应用程序调用相同的异步web api,则web api将返回完美的值。我必须在Web应用程序中使用同步方法,因此在Windows应用程序中成功测试的代码不能在Web应用程序中使用。 下面是代码的一部分。

    private string SECURE_API_Async(string WebApiURL, HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues)
    {
        try
        {
            using (httpContent)
            {

                Last_HTTPRequestContent = httpContent == null ? "null" :  httpContent.ReadAsStringAsync().Result;
                HttpClient httpClient = new HttpClient(httpClientHandler);
                httpClient.BaseAddress = new Uri(WebApiURL);

                if (SessionTokenID != null)
                {
                    httpClient.DefaultRequestHeaders.Add("SessionTokenID", SessionTokenID);
                }

                httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
                string target_URI = "api";

                foreach (string apiName in apiNames)
                {
                    target_URI = string.Format("{0}/{1}",
                        target_URI,
                        apiName);
                }

                string target_URI_parameters = string.Empty;

                if (apiValues != null)
                {
                    target_URI_parameters = CreateParameterString(apiValues);
                }
                target_URI = (target_URI_parameters == string.Empty) ? target_URI : string.Format("{0}?{1}", target_URI, target_URI_parameters);

                _lastURL = httpClient.BaseAddress.ToString() + target_URI;
                Last_HTTPstatus = 0;
                Last_ReasonPhrase = string.Empty;
                Last_HTTPResponse = null;
                Last_HTTPResponseString = string.Empty;

                HttpResponseMessage response = null;

                try
                {
                    switch (httpMethod)
                    {
                        case HTTP.PUT:
                            {
                                response = httpClient.PutAsync(target_URI, httpContent).Result;
                                break;
                            }

调用PutAsync方法时出错。

现在,如果我将方法更改为

private **async** **Task<string>** SECURE_API_Async(string WebApiURL,       HttpContent httpContent, string[] apiNames, HTTP httpMethod, DictionaryEntry[] apiValues)

和API调用

response = **await** httpClient.PutAsync(target_URI, httpContent);

我得到了正确的回复。 我在搜索网后学到的是

response = **await** httpClient.PutAsync(target_URI, httpContent);

(当调用方法具有异步关键字时,意味着调用方法是异步的)和

response = httpClient.PutAsync(target_URI, httpContent).**Result**;

(当方法没有async关键字时意味着调用方法是同步的)

应该返回正确的响应消息。 但我的同步方法抛出了底层连接错误。 有人可以帮忙吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

我传递了错误的凭据。所以我收到错误远程主机强行关闭现有连接。奇怪的错误。如果您使用MS技术,其中一个令人头疼的问题。他们只是没有抛出正确的错误。正确的错误输出应该是用户凭据错误。

但问题是,如果使用Result,则可以调用异步方法 例如。

HttpResponseMessage response = httpClient.PutAsync(target_URI,httpContent).Result; //来自同步方法的同步调用

HttpResponseMessage response = await httpClient.PutAsync(target_URI,httpContent); //来自ASync方法的同步调用,该方法具有async关键字前缀

给出相同的结果。