#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, это было бы неплохо.