2015-06-30 17 views
17

mam jakiś plik do przesłania, a niektóre z plików nie powiodło się, ponieważ wpis jest asynchroniczny i synchroniczny nie ..tworzenie synchronicznych klienta http: czekać na odpowiedź

Próbuję zrobić to wezwanie jako zsynchronizowany rozmowy ..

Chcę poczekać na odpowiedź.

Jak mogę ustawić to połączenie jako synchroniczne?

static async Task<JObect> Upload(string key, string url, string 
           sourceFile, string targetFormat) 
{ 
    using (HttpClientHandler handler = new HttpClientHandler { 
              Credentials = new NetworkCredential(key, "") 
             }) 
    using (HttpClient client = new HttpClient(handler)) 
    { 
     var request = new MultipartFormDataContent(); 
     request.Add(new StringContent(targetFormat), "target_format"); 
     request.Add(new StreamContent(File.OpenRead(sourceFile)), 
             "source_file", 
             new FileInfo(sourceFile).Name); 

     using (HttpResponseMessage response = await client.PostAsync(url, 
                  request).ConfigureAwait(false)) 

     using (HttpContent content = response.Content) 
     { 
      string data = await content.ReadAsStringAsync().ConfigureAwait(false); 
      return JsonObject.Parse(data); 
     } 
    } 
} 

Każda pomoc doceniona!

+1

Czy możesz podać więcej szczegółów na temat niepowodzenia? Wykonywanie asynchroniczne nie powinno powodować niepowodzenia przesyłania. Jeśli naprawdę musisz, możesz użyć Task.Wait i sprawdzić wartość zwracaną, aby zobaczyć, czy zadanie zostało zakończone. https://msdn.microsoft.com/en-us/library/dd235606(v=vs.110).aspx –

+1

Myślę, że nie powinieneś używać ConfigureAwait. Sprawdź bez ConfigureAwait. – Amit

+0

@rikkigibson kontynuowanie po 'czekaj' na surowym wątku z puli wątków (bez poprawnie skonfigurowanego wątku HttpContext/Culture lub UI) generalnie będzie wskazywał NRE w wywołującym metodę (ani kod wywołujący, ani błąd, ani struktura nie jest pokazana przez OP tak mocno, aby dokładny problem). Jak zauważył Amit, 'ConfigureAwait' jest zwykle sposobem na niepoprawne działanie kodu (w nadziei na rozwiązanie innych problemów z synchronizacją). To znaczy. tutaj jest dyskusja na temat korzystania z ASP.Net - http://stackoverflow.com/questions/13489065/best-practice-to-call-configureawait-for-all-server-side-code. –

Odpowiedz

1

To powinno wystarczyć:

static async Task<JObect> Upload(string key, string url, string 
          sourceFile, string targetFormat) 
{ 
    using (HttpClientHandler handler = new HttpClientHandler { 
              Credentials = new NetworkCredential(key, "") 
            }) 
    using (HttpClient client = new HttpClient(handler)) 
    { 
     var request = new MultipartFormDataContent(); 
     request.Add(new StringContent(targetFormat), "target_format"); 
     request.Add(new StreamContent(File.OpenRead(sourceFile)), 
            "source_file", 
            new FileInfo(sourceFile).Name); 

     using (HttpResponseMessage response = await client.PostAsync(url,request)) 

     using (HttpContent content = response.Content) 
     { 
      string data = await content.ReadAsStringAsync(); 
      return JsonObject.Parse(data); 
     } 
    } 
} 
+1

bez configureAwait (false), przesyłanie nie jest zakończone. Czytałem ten blog i dodałem go: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html –

38

zmiana

await content.ReadAsStringAsync().ConfigureAwait(false) 

do

content.ReadAsStringAsync().Result 

ReadAsStringAsync zwraca obiekt zadań. ".Result" na końcu linii mówi kompilatorowi, aby zwrócił wewnętrzny ciąg.

Powiązane problemy