C# HttpWebRequest.BeginGetResponse引发意外异常
我正在构建一个WindowsPhone8应用程序,它调用一系列REST服务。 服务已经过测试,一切正常,我还有一些来自IISExpress服务器的日志,因为我在这里测试我工作站上的一切 当我试图重复一系列PUT请求时,我的问题就会出现。在我进行测试时,这些请求每次都是相同的。第一个回答可以。第二个是用来回答401个未经授权的问题,根据日志,这是可以的C# HttpWebRequest.BeginGetResponse引发意外异常,c#,rest,windows-phone-8,httpwebrequest,C#,Rest,Windows Phone 8,Httpwebrequest,我正在构建一个WindowsPhone8应用程序,它调用一系列REST服务。 服务已经过测试,一切正常,我还有一些来自IISExpress服务器的日志,因为我在这里测试我工作站上的一切 当我试图重复一系列PUT请求时,我的问题就会出现。在我进行测试时,这些请求每次都是相同的。第一个回答可以。第二个是用来回答401个未经授权的问题,根据日志,这是可以的 2014-02-11 14:29:24 169.254.80.80 PUT/api/UserData key=2a80391882dc4a29fb
2014-02-11 14:29:24 169.254.80.80 PUT/api/UserData key=2a80391882dc4a29fb4419bd70861ef9&sign=220a5962580eb5690109b2602be75b5fadf508ce9f464e4bdfae33f4520f9729&addresses=True 1476-169.254.127.48本地主机-4010 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;
}
}
公共异步任务httpRequest(HttpWebRequest)
{
收到字符串;
使用(var response=(HttpWebResponse)(wait Task.Factory.fromsync(request.BeginGetResponse,request.EndGetResponse,null)))
{
if(response.StatusCode!=HttpStatusCode.OK)
{
请求失败(请求失败);
开关(响应状态代码)
{
案例HttpStatusCode.InternalServerError:
抛出新的WebException(新的StreamReader(response.GetResponseStream()).ReadToEnd(),null,WebExceptionStatus.UnknownError,response);
案例HttpStatusCode。未经授权:
this.IsAuthorizedProblem=true;
抛出新的WebException(新的StreamReader(response.GetResponseStream()).ReadToEnd(),null,WebExceptionStatus.ProtocolError,response);
案例HttpStatusCode.BadRequest:
抛出新的WebException(新的StreamReader(response.GetResponseStream()).ReadToEnd(),null,WebExceptionStatus.ProtocolError,response);
违约:
抛出新的WebException(新的StreamReader(response.GetResponseStream()).ReadToEnd(),null,WebExceptionStatus.UnknownError,response);
}
抛出新的WebException(新的StreamReader(response.GetResponseStream()).ReadToEnd(),null,WebExceptionStatus.UnknownError,response);
}
使用(var responseStream=response.GetResponseStream())
{
使用(var sr=新的StreamReader(responseStream))
{
已接收=等待sr.ReadToEndAsync();
}
}
请求成功(请求);
收到的报税表;
}
}
我无法理解的是,在BeginGetResponse级别,我抛出了一个异常,并显示一条消息“服务器返回错误:未找到”。
最大的问题是:
-我自己无法处理该状态,因为它被封装在一个WebException中,该WebException不知道HttpStatusCode
-未找到真正的错误,但未经授权。我的程序可以像预期的那样处理未经授权的错误,但这个错误只是被上面的一个函数捕捉到,该函数说“如果发生任何错误,请在几分钟后重试”
以下是有关异常的一些信息:
GetAddresses->GetAuthRequest{System.Net.WebException:远程服务器返回错误:NotFound。-->System.Net.WebException:远程服务器返回错误:NotFound。
位于System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
在System.Net.Browser.ClientHttpWebRequest.c_DisplayClasse.b_d(对象发送状态)中
在System.Net.Browser.AsyncHelper.c_DisplayClass1.b_0中(对象发送状态)
---内部异常堆栈跟踪的结束---
位于System.Net.Browser.AsyncHelper.BeginNoui(SendOrPostCallback beginMethod,对象状态)
位于System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
在System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar,Func
2 endFunction,Action1 endAction,Task
1 Promission,布尔要求同步)
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。很抱歉,这只是我在谷歌上搜索的一个坏习惯。