'System.Net.HttpWebRequest' 不包含 'GetRequestStream' 的定义

13 浏览
0 Comments

'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包。

0
0 Comments

在WP8中,System.Net.HttpWebRequest类没有GetRequestStream或GetRequestStreamAsync方法。解决该问题的最佳方法是创建一个Task并等待它完成,代码如下:

using (var stream = await Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null))
{
    // ...
}

需要注意的是,如果想要使用await关键字,登录方法必须是异步的,代码如下:

public async Task LoginAsync()
{
    // ...
}

调用登录方法时,调用者需要使用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属性)。但这样做将消除异步编程的好处,即用户界面可以在登录过程中“做些什么”,并且在登录过程中仍然可以响应。如果你有一个“登录”按钮之类的东西,你可以在点击事件处理程序中异步等待登录完成,这样可以显示一个繁忙的旋转图标,例如,而无需自己进行任何后台多线程处理。

0