2017-09-22 20 views
0

HTTPクライアントを使用してASMX WebMethod内のRESTサービスを呼び出すことは可能ですか? httpclientライブラリはasyncで、asmxはasync await(TAP)をサポートしていないため、呼び出しを強制的に同期させるために.Resultを使用しました。しかし、この時点では、httpclientは正常に呼び出すことができず、リモートサーバは接続エラーを積極的に拒否します。 async awaitまたは.Resultを使用してwinフォームアプリケーションで同じコードを実行すると、正常に動作します。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で行うべきではない2つのことを行いました: '.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

私は理解します。私の質問に答えてくれてありがとう –

関連する問題