【问题标题】:'System.Net.HttpWebRequest' does not contain a definition for 'GetResponse'“System.Net.HttpWebRequest”不包含“GetResponse”的定义
【发布时间】: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


【解决方案1】:

WP8 支持 .NET Framework 4.5 的子集。

您可以根据需要调整以下代码变体:

WebRequest request = WebRequest.Create(url);
return Task.Factory.FromAsync(request.BeginGetResponse, result =>
{
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
    ...
}

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
    ...
}

【讨论】:

  • 得到了一组构建错误.... 1) 'System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult, System.Action)' 的最佳重载方法匹配有一些无效的参数 ------------------ 2) 参数 1:无法从“方法组”转换为“System.IAsyncResult”
  • 添加了替代版本以防万一。两者都在我自己的 WP8 应用程序中使用,因此已经过测试。
  • 是的,部分成功,还有一个小错误“错误2异步方法的返回类型必须为void,Task或Task
  • 现在代码不起作用,我已经更新了问题:请参阅更新 2。
  • 问题解决了;答案已在问题本身中更新......如果你能告诉我如何用 JSON 解析它,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
相关资源
最近更新 更多