Arn*_*ing 9 silverlight httpwebrequest iasyncresult windows-phone-7
在Silverlight,Windows Phone 7的项目我创建一个HttpWebRequest的,得到RequestStream,写的东西进入流,并得到响应,但我总是得到NotSupportedException异常:"System.Net.Browser.OHWRAsyncResult.AsyncWaitHandle抛出类型'System.NotSupportedException'的异常
我的生产代码要复杂得多,但我可以将其缩小到这一小段代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
}
有人知道这段代码有什么问题吗?
bra*_*ye3 22
在NotSupportedException当请求流调用之前未关闭皆可抛EndGetResponse.当您尝试获取响应时,WebRequest流仍处于打开状态并将数据发送到服务器.由于stream实现了IDisposable接口,因此一个简单的解决方案是使用using块中的请求流来包装代码:
private void BeginRequest(IAsyncResult ar)
{
using (Stream stream = request.EndGetRequestStream(ar))
{
//write to stream in here.
}
state.Request.BeginGetResponse(
new AsyncCallback(BeginResponse), state);
}
Run Code Online (Sandbox Code Playgroud)
在尝试从Web服务器获取响应之前,using块将确保关闭流.
问题在于您如何处理从 的回调中访问原始请求BeginGetResponse。
与其持有状态引用,不如使用以下命令获取对原始请求的引用:
var request = (HttpWebRequest)asynchronousResult.AsyncState;
Run Code Online (Sandbox Code Playgroud)
看一下这个非常基本(但有效)的示例,该示例通过向网站发布电子邮件和密码凭据来实现登录。
public static string Email;
public static string Password;
private void LoginClick(object sender, RoutedEventArgs e)
{
Email = enteredEmailAddress.Text.Trim().ToLower();
Password = enteredPassword.Password;
var request = (HttpWebRequest)WebRequest.Create(App.Config.ServerUris.Login);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.BeginGetRequestStream(ReadCallback, request);
}
private void ReadCallback(IAsyncResult asynchronousResult)
{
var request = (HttpWebRequest)asynchronousResult.AsyncState;
using (var postStream = request.EndGetRequestStream(asynchronousResult))
{
using (var memStream = new MemoryStream())
{
var content = string.Format("Password={0}&Email={1}",
HttpUtility.UrlEncode(Password),
HttpUtility.UrlEncode(Email));
var bytes = System.Text.Encoding.UTF8.GetBytes(content);
memStream.Write(bytes, 0, bytes.Length);
memStream.Position = 0;
var tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
postStream.Write(tempBuffer, 0, tempBuffer.Length);
}
}
request.BeginGetResponse(ResponseCallback, request);
}
private void ResponseCallback(IAsyncResult asynchronousResult)
{
var request = (HttpWebRequest)asynchronousResult.AsyncState;
using (var resp = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
{
using (var streamResponse = resp.GetResponseStream())
{
using (var streamRead = new StreamReader(streamResponse))
{
string responseString = streamRead.ReadToEnd();
// do something with responseString to check if login was successful
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8840 次 |
| 最近记录: |