2017-10-05 2 views
2

나는 웹 API를 가지고 있으며 컨트롤러에서 일부 데이터를 가져와보기에 표시하려고합니다.비동기 작업을 사용하여 데이터를 가져 와서보기에 표시하는 방법은 무엇입니까?

이 내 메인 클래스입니다 :

하나 : 나는 두 개의 컨트롤러와 내 수업을 테스트

public class APISrv 
{ 
    public string result = string.Empty; 
    public async Task<string> GetIT() 
    { 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri("http://localhost:2474/"); 
       client.DefaultRequestHeaders.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new 
       MediaTypeWithQualityHeaderValue("application/json")); 

       HttpResponseMessage Res = await 
       client.GetAsync("api/Test/Get"); 

       if (Res.IsSuccessStatusCode) 
       { 
        result = Res.Content.ReadAsStringAsync().Result; 
       } 
      } 

     } 
     catch (Exception err) 
     { 
      result=err.Message; 
     } 
     return result; 
    } 
} 

이 원인 "결과"에

public ActionResult Index() 
    { 
     APISrv aPISrv = new APISrv(); 
     aPISrv.GetIT(); 
     ViewData["mydata"] = aPISrv.result; 
     return View(); 
    } 

공공 필드 항상 비어 있습니다, 그것은 메인 스레드가 비동기 메서드는 work.i 내 view를 볼 수 있지만 "ViewData ["mydata "]"비어 있습니다 기다리는 것 같습니다. 초에

이의

public ActionResult Index() 
    { 
     APISrv aPISrv = new APISrv(); 
     ViewData["mydata"] = aPISrv.GetIT().Result; 
     return View(); 
    } 

모드 "지역 ... 기다리고"내 페이지 체류의 원인이 아무것도 작동하지 않습니다.

수업에서 데이터를 가져 오는 가장 좋은 방법은 무엇입니까?

답변

3

블로킹 통화 (.Result)를 async/await과 혼합하면 교착 상태가 발생할 수 있습니다. 이것이 컨트롤러 동작을 호출 할 때 결과를 얻지 못하는 이유입니다.

참조 Async/Await - Best Practices in Asynchronous Programming

어느 모든 방법 또는 동기 모든 방법 비동기 이동합니다. 그들을 섞어서는 안된다.

result = await Res.Content.ReadAsStringAsync(); 

또한뿐만

public async Task<ActionResult> Index() { 
    var aPISrv = new APISrv(); 
    ViewData["mydata"] = await aPISrv.GetIT(); 
    return View(); 
} 

또한 그 서비스 밖으로 추출하고 생성자 주입을 통해 주입한다 비동기로 동작을 업데이트하지만,이 문제의 범위를 벗어난다.

+0

도와 주셔서 고맙습니다. 코드가 멋지지만, 짧은 PLZ로 나를 쓸 수 있습니다. 내 컨트롤러를 정상 모드에서 변경하고 싶지 않으면 어떻게 처리 할 수 ​​있습니까? 내 컨트롤러는 "ActionResult"를 반환하지 않습니다. "작업 "? – motevalizadeh