我正在构建一个调用大量REST服务的WindowsPhone 8应用程序。 服务经过测试,一切正常,我的IISExpress服务器也有一些日志,因为我在这里测试工作站上的所有内容。
当我试图重复一堆PUT请求时,我的问题会弹出。在我测试时,这些请求每次都是相同的。第一个回答OK。第二个是回答401 UnAuthorized,根据日志,没关系。
2014-02-11 14:29:24 169.254.80.80 PUT /api/UserData key=2a80391882dc4a29fb4419bd70861ef9&sign=220a5962580eb5690109b2602be75b5fadf508ce9f464e4bdfae33f4520f9729&addresses=True 1476 - 169.254.127.48 NativeHost - 401 0 0 60
问题出现在客户端。
我有这个:
public async Task<string> httpRequest(HttpWebRequest request)
{
string received;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
if (response.StatusCode != HttpStatusCode.OK)
{
RequestFailed(request);
switch (response.StatusCode)
{
case HttpStatusCode.InternalServerError:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
case HttpStatusCode.Unauthorized:
this.IsAuthorizedProblem = true;
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.ProtocolError, response);
case HttpStatusCode.BadRequest:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.ProtocolError, response);
default:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
}
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
}
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
received = await sr.ReadToEndAsync();
}
}
RequestSucceded(request);
return received;
}
}
我无法理解的是,在BeginGetResponse级别,我收到一个异常,并显示消息“服务器返回错误:未找到”。
最大的问题是:
- 我无法自己处理状态,因为它封装在一个不知道HttpStatusCode
的WebException中
- 真正的错误不是 Not Found ,而是 UnAuthorized 。我的程序可以处理 UnAuthorized ,因为它是预期的,但是这个错误只是被上面的函数捕获,上面写着“发生任何错误,请在几分钟后重试”。
以下是有关例外的一些信息:
GetAddresses-&gt; GetAuthRequest {System.Net.WebException:远程服务器返回错误:NotFound。 ---&GT; System.Net.WebException:远程服务器返回错误:NotFound。 在System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在System.Net.Browser.ClientHttpWebRequest。&lt;&gt; c_ DisplayClasse.b _d(Object sendState) 在System.Net.Browser.AsyncHelper。&lt;&gt; c_ DisplayClass1.b _0(Object sendState) ---内部异常堆栈跟踪结束--- 在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,Object state) 在System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在System.Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar, Func
2 endFunction,Action1 endAction, Task
1 promise,Boolean requiresSynchronization) ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()