【发布时间】:2014-06-20 20:46:31
【问题描述】:
我正在使用框架 4.5 在 Visual Studio 2013 中创建一个使用 restful GET 方法的方法。这是 windows_phone_8(针对 Phone OS 8.0)应用程序。这是我的代码。
static string HttpGet(string url)
{
HttpWebRequest req = WebRequest.Create(url)
as HttpWebRequest;
string result = null;
using (HttpWebResponse resp = req.GetResponse()
as HttpWebResponse)
{
StreamReader reader =
new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
但我收到如下构建错误
'System.Net.HttpWebRequest' 不包含对 'GetResponse' 并且没有扩展方法 'GetResponse' 接受第一个 可以找到“System.Net.HttpWebRequest”类型的参数(你是 缺少 using 指令或程序集引用?)
我不知道为什么会这样,相同的代码在相同的环境中与 Windows_application 运行良好。
更新:我也尝试过使用网络客户端方法
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stream data = client.OpenRead("http://192.168.10.73:8087/cisms/mobilews/login/userNameCheck?userName=supervisor");
StreamReader reader = new StreamReader(data);
string s = reader.ReadToEnd();
data.Close();
reader.Close();
出现另一组错误...
错误 1 'System.Net.WebHeaderCollection' 不包含定义 对于“添加”并且没有扩展方法“添加”接受第一个参数 可以找到类型“System.Net.WebHeaderCollection”(您是否缺少 using 指令还是程序集引用?)
错误 2 'System.Net.WebClient' 不包含 'OpenRead' 并且没有扩展方法 'OpenRead' 接受第一个 可以找到“System.Net.WebClient”类型的参数(你是 缺少 using 指令或程序集引用?)
错误 3 'System.Net.HttpWebRequest' 不包含对 'GetResponse' 并且没有扩展方法 'GetResponse' 接受第一个 可以找到“System.Net.HttpWebRequest”类型的参数(你是 缺少 using 指令或程序集引用?)
更新 2:
根据@Gavin'的回答,我已将代码更改如下..
static async void HttpGet(string url)
{
Uri uri = new Uri(url);
string result = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
StreamReader reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
}
}
但是控制又回到了调用事件,从下面一行
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
对此的任何帮助将不胜感激。
答案:
我将代码更改如下,它现在可以工作了..
public async Task<string> httpRequest(string url)
{
Uri uri = new Uri(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
string received;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
received = await sr.ReadToEndAsync();
}
}
}
return received;
}
调用部分如下...
private async void Button_Click(object sender, RoutedEventArgs e)
{
string uriString = "http://192.168.10.73:8087/cisms/mobilews/login/userNameCheck?userName=supervisor";
var response = await httpRequest(uriString);
}
更新 3:
我在处理 POST 请求时还有一个问题。我试过的代码如下。
static string HttpPost(string url, string[] paramName, string[] paramVal)
{
HttpWebRequest req = WebRequest.Create(new Uri(url))
as HttpWebRequest;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
// Build a string with all the params, properly encoded.
// We assume that the arrays paramName and paramVal are
// of equal length:
StringBuilder paramz = new StringBuilder();
for (int i = 0; i < paramName.Length; i++)
{
paramz.Append(paramName[i]);
paramz.Append("=");
paramz.Append(HttpUtility.UrlEncode(paramVal[i]));
paramz.Append("&");
}
// Encode the parameters as form data:
byte[] formData =
UTF8Encoding.UTF8.GetBytes(paramz.ToString());
req.ContentLength = formData.Length;
// Send the request:
using (Stream post = req.GetRequestStream())
{
post.Write(formData, 0, formData.Length);
}
// Pick up the response:
string result = null;
using (HttpWebResponse resp = req.GetResponse()
as HttpWebResponse)
{
StreamReader reader =
new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
此方法在 Windows phone 8 应用程序中有两个构建错误
错误 1 'System.Net.HttpWebRequest' 不包含对 'GetRequestStream' 并且没有扩展方法 'GetRequestStream' 接受“System.Net.HttpWebRequest”类型的第一个参数可以 被发现(您是否缺少 using 指令或程序集引用?)
错误 2 'System.Net.HttpWebRequest' 不包含 'GetResponse' 并且没有扩展方法 'GetResponse' 接受第一个 可以找到“System.Net.HttpWebRequest”类型的参数(你是 缺少 using 指令或程序集引用?)
谢谢 塞巴斯蒂安
【问题讨论】:
-
更一般地说,在 WP8 中,您通常会尝试使用不起作用且您不知道原因的方法。那是因为有些方法可以在 W8 或 WinRT 上运行,但不能在 WP8 上运行。当您遇到一些应该可以工作的代码并且遇到这样的错误时,只需谷歌“您的方法 WP8”,您可能会找到可以使用的替代方法
标签: windows-phone-8 visual-studio-2013