2017-09-22 58 views
0

是否可以使用httpclient在ASMX WebMethod中調用REST服務? httpclient庫是異步的,因爲asmx不支持異步等待(TAP),我使用.Result強制呼叫同步。但是,這次httpclient無法成功調用,並且我得到遠程服務器主動拒絕連接錯誤。如果我在win窗體應用程序中使用async await或.Result運行同一段代碼,它可以正常工作。在asmx webmethod中使用httpclient

這是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中註冊該模塊。在代碼中,您必須檢查該請求是否適用於您的Web服務,如果是,請執行您的操作。否則跳出來讓asp流水線繼續。有很多使用模塊的資源,但是除非你真的需要爲可伸縮性去異步,否則我仍然建議你使用同步的'HttpWebRequest'。 – Crowcoder

+0

我明白了。非常感謝您回答我的問題 –

相關問題