问题描述
在 Silverlight-Windows Phone 7 项目中,我正在创建一个 HttpWebRequest,获取 RequestStream,将一些内容写入 Stream 并尝试获取响应,但我总是收到 NotSupportedException:System.Net.Browser.OHWRAsyncResult.AsyncWaitHandle 抛出了‘System.NotSupportedException’类型的异常
in a Silverlight-Windows Phone 7-project I am creating an HttpWebRequest, get the RequestStream, write something into the Stream and try to get the response, but I always get a NotSupportedException:"System.Net.Browser.OHWRAsyncResult.AsyncWaitHandle threw an exception of type 'System.NotSupportedException'
我的生产代码要复杂得多,但我可以将其缩小到这一小段代码:
My production code is far more complicated, but I can narrow it down to this small piece of code:
public class HttpUploadHelper
{
private HttpWebRequest request;
private RequestState state = new RequestState();
public HttpUploadHelper(string url)
{
this.request = WebRequest.Create(url) as HttpWebRequest;
state.Request = request;
}
public void Execute()
{
request.Method = "POST";
this.request.BeginGetRequestStream(
new AsyncCallback(BeginRequest), state);
}
private void BeginRequest(IAsyncResult ar)
{
Stream stream = state.Request.EndGetRequestStream(ar);
state.Request.BeginGetResponse(
new AsyncCallback(BeginResponse), state);
}
private void BeginResponse(IAsyncResult ar)
{
// BOOM: NotSupportedException was unhandled;
// {System.Net.Browser.OHWRAsyncResult}
// AsyncWaitHandle = 'ar.AsyncWaitHandle' threw an
// exception of type 'System.NotSupportedException'
HttpWebResponse response = state.Request.EndGetResponse(ar) as HttpWebResponse;
Debug.WriteLine(response.StatusCode);
}
}
public class RequestState
{
public WebRequest Request;
}
}
有人知道这段代码有什么问题吗?
Does anybody know what is wrong with this code?
推荐答案
NotSupportedException
在调用 EndGetResponse
之前没有关闭请求流时,可以抛出 NotSupportedException
.当您尝试获取响应时,WebRequest 流仍处于打开状态并向服务器发送数据.由于流实现了 IDisposable
接口,一个简单的解决方案是使用请求流将代码包装在 using
块中:
The NotSupportedException
can be thrown when the request stream isn't closed before the call to EndGetResponse
. The WebRequest stream is still open and sending data to the server when you're attempting to get the response. Since stream implements the IDisposable
interface, a simple solution is to wrap your code using the request stream in a using
block:
private void BeginRequest(IAsyncResult ar)
{
using (Stream stream = request.EndGetRequestStream(ar))
{
//write to stream in here.
}
state.Request.BeginGetResponse(
new AsyncCallback(BeginResponse), state);
}
using 块将确保在您尝试从 Web 服务器获取响应之前关闭流.
The using block will ensure that the stream is closed before you attempt to get the response from the web server.
这篇关于HttpWebRequest.EndGetResponse 在 Windows Phone 7 中引发 NotSupportedException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!