2012-02-28 3 views
4

私はAzureにWCF RESTサービスをたくさん用意しています。いくつかのWCFサービスの中で、私は外部サービスにHttpリクエスト(Eメール/ SMSを送信する)を要求します。 第三者サービスへのhttp要求は、重要ではないです。私はそれがクライアントの呼び出しに対する私の応答を妨げないようにしたい。この場合に使用するパターンについてのガイダンスが必要です。これは私のwcfサービス内のパターンを忘れるためのものです。WCFサービス内から発砲して忘れる

WCFサービスのための擬似コード

[WebInvoke(UriTemplate = "process", Method = "POST")] 
    [OperationContract] 
    public bool DoSomeProcessing(DataEntity data) 
    { 
     bool result = ProcessData(data); 
     //I do not want this call to block 
     SendSMS();    
    } 

    //Call to third party 
    public void SendSMS() 
    { 
     HttpWebRequest objWebRequest = null; 
     HttpWebResponse objWebResponse = null; 

     objWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     objWebRequest.Method = "GET"; 

     //I do not want to wait for this response since often the web requests takes a bit of time. 
     //objWebResponse = (HttpWebResponse)objWebRequest.GetResponse(); 
    } 

すべての私のWCFサービスインスタンスコンテキストモードはPerCallに設定されています。

InstanceContextMode = InstanceContextMode.PerCall 

電子メールとSMSを送信するサービスがいくつかあります。 SMSの復帰までこれらのサービスをブロックしたくありません。

私は文学にまで読んで、3つの方法が

  1. 火を立って、ThreadPool.QueueUserWorkItemを使用して忘れて - 私は、スレッドの数にいくつかの制限を見ていますとすべての私のWCF呼び出しがある場合PerCallはQueueUserWorkItemう安全ですか?

  2. SendSMS機能に対してonewayオプションが有効になっている別のWCF RESTサービスを用意しています(これは、ハッキングのように見えますが)。

  3. EndInvokeを

    なし

    使用BeginInvokeを

最後に、私が行方不明です何Azureの特定があります。正しい方向のポインタがあれば分かるはずです。

答えて

2

One Way Contractsをご覧ください。 この属性を示すサービスを使用して、外部サービスに呼び出しをラップします。

1

非同期呼び出しとして呼び出すと、それらを起動して忘れることができます。私はそれが最も簡単な方法だと思います。 BeginInvokeを呼び出す。これらの方法のどれもうまくいくはずです。 Azureには、この種の状況を処理するための固有のものはありません。

1

あなたはRestSharpあなたは以下に示すように、要求を実行するために非同期メソッドを持つことになり呼ばれるサードパーティ製のコントロールを使用して罰金している場合:

  var client = new RestClient(); 
      client.BaseUrl = serviceBaseUrl; 
      var request = new RestRequest(method) { DateFormat = DataFormat.Xml.ToString(), Resource = resourceUrl }; 
      request.AddParameter("text/xml", requestBody, ParameterType.RequestBody);  
      client.ExecuteAsync(request, callback);     

後でいくつかの通知が必要な場合は、コールバックメソッドを使用することができます。

あなたは以下に示すように、あなたはHttpClientをオブジェクトを使用することができるサードパーティ製のDLLを使用したくない場合は、次のHttpClientの

var client = new HttpClient(); 
client.DefaultHeaders.ContentType = "application/json"; 
HttpRequestMessage req = new HttpRequestMessage("GET", ""); 
client.SendAsync(req); 

名前空間はMicrosoft.Http

です
関連する問題