2014-04-02 5 views
0

API 컨트롤러를 작성하려고하는데 WebApi에 메시지를 게시 한 후 응답이 없습니다. 나는 인터넷 검색을 시도하고 몇 가지 답변을 찾았지만, 그것은 나를 위해 작동하지 않습니다. 나는 왜 그런지 이해하지 못한다.WebApi에서 올바른 방법으로 응답하는 방법

public ActionResult Test() 
{ 
    RunAsync().Wait(); 
    return null; 
} 

static async Task RunAsync() 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://localhost:50984/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     // HTTP POST 
     var gizmo = new ErrorModel 
     { 
      Key = "2ccab87f5f904d3688a28b1a1fb4269b", 
      Name = "HTTP Error 404" 
     }; 
     HttpResponseMessage response = await client.PostAsJsonAsync("exceptionregistration/handle", gizmo); 
     if (response.IsSuccessStatusCode) 
     { 
     } 
    } 
} 

WebApi 컨트롤러 : HTTP POST 요청에 대한

코드 (here에서, 그것은 간단한 MVC 컨트롤러에서 불과 예입니다)

public class HandleController : ApiController 
{ 
    [System.Web.Http.HttpPost, ValidateInput(false)] 
    public HttpResponseMessage Post([FromBody]ErrorModel errorData) 
    { 
     try 
     { 
      // some code 
     } 
     catch (Exception ex) 
     { 
      Logger.error(ex); 
      return null; 
     } 
     return Request.CreateResponse(HttpStatusCode.OK, "value"); 
    } 
} 

그리고이 줄은 적이있다 완전히 실행 됨 (응답 없음) :

HttpResponseMessage response = await client.PostAsJsonAsync("exceptionregistration/handle", gizmo); 

무엇이 잘못 되었습니까? 응답을 기다리는 중 왜 결과가 나오지 않습니까?
웹 API 컨트롤러에 json 메시지를 게시하는 것이 더 좋은 방법일까요?

+0

'그리고이 라인에 public async Task<ActionResult> Test()에 완전히 실행 된 적이없는 (응답 없음)'당신은 어떻게 압니까? –

+0

'if (response.IsSuccessStatusCode) {Thread.Sleep (10);}'응답 코드를 검사하려고했습니다. 결과가 없다. –

+0

코드에 그런 행이 없습니다. 응답 코드를 어떻게 확인 했습니까? 'Thread.Sleep (10);'이 상황에서는 아무 것도하지 않습니다. –

답변

1

나는 RunAsync().Wait(); 때문에 교착 상태에 빠져 있다고 생각합니다. Test() 메서드가 컨텍스트 스레드를 차단하고 RunAsync()이 완료 될 때까지 대기하고 RunAsync()이 컨텍스트가 완료 될 때까지 기다리는 중입니다. Stephen Cleary의이 블로그에서 문제를 자세히 설명합니다 : link.

이 솔루션은 RunAsync()에 "대기"를 허용하는 서명을 변경하는 것 :

public ActionResult Test()

RunAsync().Wait();await RunAsync();

+0

고마워요! 그것은 작동합니다! –

0

fiddler을 사용하면 API 작동 여부를 확인할 수 있습니다.

관련 문제