‘System.Net.HttpWebRequest’ не содержит определения для ‘GetResponse’

#windows-phone-8 #visual-studio-2013

#windows-phone-8 #visual-studio-2013

Вопрос:

Я создаю метод для использования метода restful GET в Visual Studio 2013 с framework 4.5. Это приложение windows_phone_8 (ориентированное на телефонную ОС 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 resu<
    }
  

Но я получаю ошибку сборки следующим образом

‘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’ не содержит определения для ‘Add’ и не удалось найти метод расширения ‘Add’, принимающий первый аргумент типа ‘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();
        }
    }
  

But the control goes back to the calling event, from the following line

 using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
  

any help on this would be greatly appreciated.

Answer :

I changed the code as follows and it is working now..

 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;
        }
  

the calling part is as follows…

 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("amp;");
            }

            // 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 resu<
        }
  

Этот метод имеет две ошибки сборки в приложении Windows phone 8

Ошибка 1 ‘System.Net.HttpWebRequest’ не содержит определения для ‘GetRequestStream’ и не удалось найти метод расширения ‘GetRequestStream’, принимающий первый аргумент типа ‘System.Net.HttpWebRequest’ (вам не хватает директивы using или ссылки на сборку?)

Ошибка 2 ‘System.Net.HttpWebRequest’ не содержит определения для ‘GetResponse’ и не удалось найти метод расширения ‘GetResponse’, принимающий первый аргумент типа ‘System.Net.HttpWebRequest’ (вам не хватает директивы using или ссылки на сборку?)

Спасибо, Себастьян

Комментарии:

1. В более общем плане, часто в WP8 вы будете пытаться использовать методы, которые не будут работать, и вы не знаете, почему. Это потому, что есть некоторые методы, которые работают на W8 или WinRT, но не на WP8. Когда вы сталкиваетесь с каким-либо кодом, который ДОЛЖЕН работать, и вы получаете такую ошибку, просто загуглите «ваш метод WP8», и вы, вероятно, найдете, какой метод замены вы можете использовать

Ответ №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. получена группа ошибок сборки …. 1) Наилучший перегруженный метод соответствует ‘System. Многопоточность. Задачи. TaskFactory. FromAsync (System. IAsyncResult, System. Действие IAsyncResult>)’ имеет некоторые недопустимые аргументы —————— 2 ) Аргумент 1: невозможно преобразовать из «группы методов» в «Систему». IAsyncResult’

2. Альтернативная версия добавлена на всякий случай, если это поможет. Оба они используются в моем собственном приложении WP8, поэтому были протестированы.

3. Да, частично удалось, небольшая ошибка остается «Ошибка 2 Тип возвращаемого значения асинхронного метода должен быть void, Task или Task <T>»

4. Теперь, когда код не работает, я обновил вопрос: см. Обновление 2 .

5. Проблема решена; ответ обновляется в самом вопросе… Если бы вы могли показать мне, как его анализировать в формате JSON, это было бы неплохо.