2017-06-20 33 views
0

私はWCFサービスを作成し、IISでホストしました。私はasp.net WebフォームアプリケーションでWeb参照を作成してWCFサービスにアクセスできます。私は、WCF Webサービスに長時間実行されるメソッド(async)を実行させる必要があります。誰もがasp.net WebフォームアプリケーションのボタンのクリックメソッドからWCF非同期メソッドを呼び出す方法の良い例のコードを持っていますか?ASP.NET Webフォーム - 非同期的にWCF非同期メソッドを呼び出す方法

IAsyncResult、EAP、およびTAPを調べました... 現在、ASP.NET WebフォームアプリケーションからWCF非同期メソッドへの非同期呼び出しを行う最良の方法はありますか?

Web参照ではなくサービス参照を使用するようにコードを変更しました。

サービスReceiptFooterService(のServiceContract、OperationsContract、のDataContract):

using System.Collections.Generic; 
using System.Net.NetworkInformation; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Threading.Tasks; 

namespace ReceiptFooterDeploymentService 
{ 
    [ServiceContract] 
    public interface IReceiptFooterService 
    { 
     [OperationContract(Name = "GetRegisterPingResults")] 
     Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs); 
    } 

    [DataContract] 
    public class StoreIP 
    { 
     private int _storeNumber; 
     private string _ipAddress; 

     [DataMember] 
     public int StoreNumber 
     { 
      get 
      { 
       return _storeNumber; 
      } 
      set 
      { 
       _storeNumber = value; 
      } 
     } 

     [DataMember] 
     public string IPAddress 
     { 
      get 
      { 
       return _ipAddress; 
      } 
      set 
      { 
       _ipAddress = value; 
      } 
     } 
    } 
} 

ReceiptFooterServiceクラス:

using System.Collections.Generic; 
using System.Linq; 
using System.Net.NetworkInformation; 
using System.Threading.Tasks; 

namespace ReceiptFooterDeploymentService 
{ 
    public class ReceiptFooterService : IReceiptFooterService 
    { 
     public async Task<List<PingReply>> GetRegisterPingResults(List<StoreIP> potentialIPs) 
     { 
      var tasks = potentialIPs.Select(sip => new Ping().SendPingAsync(sip.IPAddress, 1000)); 
      var results = await Task.WhenAll(tasks); 

      return results.ToList(); 
     } 
    } 
} 

ASP.NET Webフォームクライアント:メソッドの唯一の最初の数行(簡潔にするために)

private List<StoreDetail> PingStoreAndUpdateStatus(List<StoreDetail> storeDetails) 
{ 
    ReceiptFooterService.StoreIP[] potentialIPs = GetStoreRegisterIps(storeDetails).ToArray(); 
    ReceiptFooterService.ReceiptFooterServiceClient client = new ReceiptFooterService.ReceiptFooterServiceClient(); 
    List<PingReply> pingReplies = client.GetRegisterPingResultsAsync(potentialIPs).Result.ToList(); 

約2000のIPアドレスをpingしようとしています非同期に再開します。私は成功を示す4つの結果を得ています。しかし、他のPingReplyの詳細のどれもが表示されていません。どのIPアドレスがpingされたのか知る必要があります。

私はどこかで待っていなければなりません...それはすぐに戻ってくるのですか、失敗する原因となるエラーです。任意の提案をいただければ幸いです。 WCFを使用しているとき

+0

'WCF Webサービスで長時間実行されるメソッド(async)を実行する必要があります。 ' - [' async'はブラウザーに制御を渡しません](https://msdn.microsoft.com/en- us/magazine/dn802603.aspx)、それがあなたが考えているものなら。 –

+0

非同期pingの実行が完了したら、ブラウザにサービスをコールバックさせるにはどうすればよいですか? – tgerdes3609

+0

私はSignalRの使用をお勧めします。 –

答えて

0

この非同期メソッドを呼び出しますWebサービスでは機能していませんでした)。

私は引数で呼び出すコンソールアプリケーションを作成し、その結果をデータベースに保存しました。私はその後、Webサイトにデータベースに保存された結果にアクセスさせます。

コンソールアプリケーションのコンテキストは、同時に実行したい非同期メソッドの量をより完全に補完します。

0

まず、なぜあなたはサービス参照を使用していない:以下

、私の結果のクイックウォッチはありますか? (Web vs Service reference) 次に、SOAPクライアントを使用すると、同期とasynchronousの変形を持つ各メソッドでSOAP WCFクライアントが自動的に生成されます。
次に、あなただけの(私は私が行うために必要な非同期の仕事の種類のWCFのWebサービスを使用していることを見つけ

MyServiceClient.DummyMethodAsync(someParameters ...)

+0

ソースコードを表示すると役立つことがあります。私は後でそれを掲示します。 – tgerdes3609

関連する問題