2014-01-21 1 views
5

아래 메소드의 목표는 비동기식으로 데스크탑 애플리케이션에서 웹 컨트롤러로 http 포스트를 설정하고 시작하는 것입니다. 아래 작업을 설정하는 방법에 문제가 있어야한다고 생각합니다. 문제를 해결할 async/await 및 Task.Run과 같은 .NET 4.5에서 사용할 수있는 유용한 방법이 있다고 생각하지만 업그레이드는 현재 선택권. 아래에 설명 된 문제를 방지하기 위해 .NET 4.0에서 이것을 처리/작성하는 더 좋은 방법이 있습니까? 여러 일괄 처리 - - 실패 전에 방법은 때로는 2 ~ 3 번, 때로는 여러 작동, 때로는 심지어 게시물의 수백 작동WebException을 일으키는 PostAsync() 태스크 내의 WebException

public void PostWithoutResponse(object objectToPost, string url) { 
     Task.Factory.StartNew(() => 
     { 
      using (var handler = new HttpClientHandler()) { 
       handler.PreAuthenticate = true; 
       handler.Credentials = _credentialPool.GetNetworkCredentials(new Uri(url)); 
       using (var client = new HttpClient(handler)) { 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
        using (var stringContent = new StringContent(JsonConvert.SerializeObject(objectToPost), Encoding.UTF8, "application/json")) { 
         // We weren't able to get this post to work without waiting for result 
         var result = client.PostAsync(url, stringContent).Result; 
        } 
       } 
      } 
     }); 
    } 

. 프로그램은 계속되지만 더 이상 게시물이 데이터베이스에 반영되지 않으며 결국 예외가 발생합니다. 데이터베이스 업데이트를 중지하지만,

_innerException {"The request was canceled"} System.Exception {System.Net.WebException} 

흥미롭게 :

System.AggregateException was unhandled 
Message: An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll 
Additional information: One or more errors occurred. 

하나 개의 내부를 제외 : (. 아마 시간 초과로 인해)

우리는이 발생되는 예외 관찰 할 수 있었다 2 ~ 3 일 후에 프로그램 (자동 배치 처리 워크 플로)이 계속 실행되며 새 배치를 얻으려면이 방법에 도달 할 때까지 예외가 발생하지 않는 것 같습니다. 아마도 관련이 있을까요?

public string GetPostResult(object objectToPost, string url) { 
     string jsonResult = null; 
     using (var handler = new HttpClientHandler()) { 
      handler.PreAuthenticate = true; 
      handler.Credentials = _credentialPool.GetNetworkCredentials(new Uri(url)); 
      using (var client = new HttpClient(handler)) { 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
       var serializedContent = JsonConvert.SerializeObject(objectToPost); 
       using (var stringContent = new StringContent(serializedContent, Encoding.UTF8, "application/json")) { 
        var taskResult = client.PostAsync(url, stringContent).Result; 
        jsonResult = taskResult.Content.ReadAsStringAsync().Result; 
       } 
      } 
     } 
     return jsonResult; 
    } 

또한 나는 우리가 여러 가지 준비에 시도/캐치를 넣어 시도했습니다 언급해야하지만 밖으로 거품과 실행을 중단 할 때까지 어디 그 예외를 캡처 할 수없는 것.

는 (처음에 위의 코드를 우리의 개발 컴퓨터에서 작업 및 생산 기계에 실패,하지만이 된 임의의 행운이 우리의 역할에 대한 오해와 결합 된 것으로 판명 된 듯.)

+0

서버가 너무 빨리 작동하고 속도가 제한되는 것처럼 들립니다. –

+0

생각을 감사하게 생각하지만 왜 우리 시스템에서 같은 속도로 제대로 작동하는지 설명하지는 못합니다. – RJB

+0

@RJB 컴퓨터에 IIS를 설정해도 속도 제한이 활성화되어 있지 않으므로? –

답변

2

이 코드가 보인다 ..... 해결했습니다.

public void PostWithoutResponse(object objectToPost, string url) { 
     var uri = new Uri(url); 
     var httpPost = (HttpWebRequest)WebRequest.Create(uri); 
     httpPost.KeepAlive = false; 
     httpPost.Method = "POST"; 
     httpPost.Credentials = _credentialPool.GetNetworkCredentials(uri); 
     httpPost.ContentType = "application/json"; 
     using (var streamWriter = new StreamWriter(httpPost.GetRequestStream())) { 
      var json = JsonConvert.SerializeObject(objectToPost); 
      streamWriter.Write(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 
     Task.Factory.StartNew(() => httpPost.GetResponse()); 
    } 
+0

RJB, 마지막 행은'Task.Factory.StartNew'가없는'return httpPost.GetResponse()'가 아니어야합니까? – Noseratio

+0

먼저, 메소드가 .GetResponse()에서 동 기적으로 블로킹을 시도했다면, 이것은보다 편리하게 불과 잊을 수 있습니다. 지금까지 수천 개의 게시물을 처리했습니다. – RJB

+0

.... 'Task.Factory.FromAsync (httpPost.BeginGetResponse, httpPost.EndGetResponse, null);에 대한 인수가있을 수 있지만,'Hmmm. – RJB

관련 문제