2017-09-22 3 views
0

에서 httpclient를 사용하면 httpclient를 사용하여 ASMX WebMethod에서 REST 서비스를 호출 할 수 있습니까? httpclient 라이브러리가 async이고 asmx가 async await (TAP)를 지원하지 않기 때문에 .Result를 사용하여 호출을 동기화하도록합니다. 그러나 이번에는 httpclient가 성공적으로 전화를 걸 수 없으며 원격 서버가 연결 오류를 적극적으로 거부합니다. async await 또는 .Result를 사용하여 win forms 응용 프로그램에서 동일한 코드를 실행하면 정상적으로 작동합니다.asmx webmethod

이 문제는 ASMX WebMethod에서 발생합니까?

[WebMethod] 
public void Get(){ 

    //Sample (off the top of my head) 
    HttpClient client = new HttpClient(); 
    //more code 
    Task.Run(()=> client.GetDocument()).Result; 

} 

감사

+0

HttpClient를 새로운 클라이언트 = HttpClient를(); var tt = Task.Run (() => client.GetAsync ("http://immanuel.co")) 결과입니다. - 변수 tt가 이제 응답을 포함하고 그것의 완전 동기화 – Immanuel

+0

@Immanuel, 당신은 Asp.Net에서하지 말아야 할 두 가지 일을했습니다 -'.Result'와'Task.Run()'. [비동기 코드 차단 금지] (https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) – Crowcoder

답변

1

당신은 실제이 .asmx 코드 대신 처리를 처리하기 위해 파이프 라인에 모듈을 삽입 할 수 있습니다. 하지만 문제가 발생하기 전에 먼저 HttpWebRequest을 사용하시기 바랍니다.

.Result. Asp.Net 컨텍스트에서 Task.Run()을 수행하지 마십시오.

모듈 :

public class Proxy : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork); 
     context.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler); 
    } 

    async Task DoAsyncWork(object sender, EventArgs e) 
    { 
     // await... anything 
    } 
} 
+0

응답 해 주셔서 감사합니다. asmx webmethod에서이 클래스를 사용하려면 어떻게해야합니까? –

+0

web.config 또는 IIS에 모듈을 등록하십시오. 코드에서 요청이 웹 서비스에 대한 것이 었는지 확인해야합니다. 그렇다면 요청한 내용을 확인하십시오. 그렇지 않으면 밖으로 뛰어 내리고 asp 파이프 라인을 계속하십시오. 모듈을 사용하는 데는 많은 리소스가 있지만 확장 성을 위해 비동기로 전환해야하는 경우가 아니라면 동기식 HttpWebRequest를 사용하는 것이 좋습니다. – Crowcoder

+0

나는 이해한다. 내 질문에 답해 주셔서 대단히 감사합니다. –