Muszę uczynić następujący kod asynchroniczny i godne zaufania.Jak sprawić, by zwykły WebRequest był asynchroniczny?
Potrzebuję uzyskać wiele danych z serwera WWW, a następnie dane te zostaną wykorzystane do zapełnienia strony xaml w mojej aplikacji.
Potrzebuję więc metody DefLogin(), aby była ona godna polecenia.
Czy to możliwe?
public void DefLogin()
{
postData = "My Data To Post";
var url = new Uri("Url To Post to", UriKind.Absolute);
webRequest = WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "text/xml";
webRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest);
}
public void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();
Debug.WriteLine("Start BEGINGetResponse");
webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
}
public void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response;
response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
string Response = streamReader.ReadToEnd();
streamResponse.Close();
streamReader.Close();
response.Close();
if (Response == "")
{
//show some error msg to the user
Debug.WriteLine("ERROR");
}
else
{
//Your response will be available in "Response"
Debug.WriteLine(Response);
}
}
catch (WebException)
{
//error
}
}
Widziałem to pytanie na StackOverflow: Converting ordinary Http Post web request with Async and Await, ale nie mogłem zrozumieć odpowiedź prawidłowo.
Proszę, czy ktoś może pomóc? Byłbym bardzo wdzięczny!
Niesamowita odpowiedź. Ten naprawdę zasługuje na więcej kredytów. Z mojego doświadczenia wynika, że metody rozszerzeń powinny wyglądać tak: "return Task .Factory.FromAsync (etc ...)", w przeciwnym razie wystąpi błąd "Połączenie jest niejednoznaczne". Również NIE pomiń funkcji using(): są one bardzo ważne dla upewnienia się, że Twój strumień jest zamknięty przed EndGet ___(). –