'System.Net.HttpWebRequest' 不包含 'GetRequestStream' 的定义
'System.Net.HttpWebRequest' 不包含 'GetRequestStream' 的定义
我对C#和Windows手机都很陌生,正在尝试制作一个执行JSON请求的小应用程序。我正在按照这篇帖子中的例子进行操作https://stackoverflow.com/a/4988809/702638
我目前的代码是这样的:
public string login() { var httpWebRequest = (HttpWebRequest)WebRequest.Create(MY_URL); httpWebRequest.ContentType = "text/plain"; httpWebRequest.Method = "POST"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string text = MY_JSON_STRING; streamWriter.Write(text); } }
但是由于某种原因,Visual Studio在GetRequestStream()
处标记了一个错误消息:
错误 CS1061:'System.Net.HttpWebRequest'不包含定义'GetRequestStream'的内容,也没有找到接受类型为'System.Net.HttpWebRequest'的第一个参数的扩展方法'GetRequestStream'(是否缺少使用指令或程序集引用?)
你有什么想法为什么会发生这种情况吗?我已经导入了System.Net
包。
在WP8中,System.Net.HttpWebRequest类没有GetRequestStream或GetRequestStreamAsync方法。解决该问题的最佳方法是创建一个Task并等待它完成,代码如下:
using (var stream = await Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null)) { // ... }
需要注意的是,如果想要使用await关键字,登录方法必须是异步的,代码如下:
public async TaskLoginAsync() { // ... }
调用登录方法时,调用者需要使用await关键字,代码如下:
string result = await foo.LoginAsync();
关于这个问题,这里有一个很好的入门指南:[http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx](http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx)
如何将JSON字符串写入Task内的流中?
byte[] content = Encoding.UTF8.GetBytes(text); await stream.WriteAsync(content, 0, content.Length);
需要注意的是,你可能需要在内容类型中指定UTF-8编码。
如何从写入操作中读取数据?我使用WriteAsync调用来POST到一个URL,但是我希望能读取响应。另外,我希望从构造函数调用这个方法,但是收到了一个错误,因为构造函数不能是异步的。我真的需要在这里使用异步吗?这是用于登录服务的,直到用户进行身份验证之前没有其他操作。
请求流只能用于写入操作。要获取响应,你可以这样做:
var response = (HttpWebResponse)await Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null);
HttpWebResponse类有一个GetResponseStream方法,可以直接提供一个流来读取响应。至于在构造函数中调用它,你需要同步等待任务完成(如果省略await关键字,可以在返回的Task对象上调用Wait方法或访问Result属性)。但这样做将消除异步编程的好处,即用户界面可以在登录过程中“做些什么”,并且在登录过程中仍然可以响应。如果你有一个“登录”按钮之类的东西,你可以在点击事件处理程序中异步等待登录完成,这样可以显示一个繁忙的旋转图标,例如,而无需自己进行任何后台多线程处理。