2013-07-30 48 views
0

您好我正在寫一個WCF服務而不是託管在IIS上。它運行在我的服務器上作爲控制檯應用 我有一個由所提到的服務調用的靜態方法。在WCF調用方法加速http web請求

在這種方法中,我有異步Web請求發送短信。

有時會發生這樣的情況,即短信從未接收。經過一些調試後,我發現當我刪除異步調用時,Web請求有時會拋出一個異常,並顯示消息:'操作已超時'。當我嘗試在短時間內發送很多smss時,會發生這種情況。

但是,當我在瀏覽器中鍵入網絡請求的地址一切正常。 (我按刷新的時間,無論多快,我收到短信的次數),這是如何能夠與我所得到的。

到目前爲止,我已經

public static bool DoTheRequest(string number, string message) 
    { 
     try 
     { 
      HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(string.Format("http://SomeURL?With={0}&something={1}", number, message)); 
      myReq.BeginGetResponse(FinishWebRequest, myReq); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

     return true; 
    } 

    static void FinishWebRequest(IAsyncResult result) 
    { 
     HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse; 
    } 

編輯:

以及服務定義:

[OperationContract] 
    void TestSms(string number); 

和實施:

public void TestSms(string number) 
    { 
     Utilities.DoTheRequest(number, "THIS IS A TEST"); 
    } 

請幫忙

回答

2

根據您在短時間內調用send-sms函數的次數,我推測它的速度比您在瀏覽器中刷新的速度快得多 - 而且您用你的短信呼叫來管理你正在使用的任何服務。

在這種情況下,我會建議您的web服務方法實際上將SMS放入隊列中,並且某種後臺工作線程設計爲不限制實際發送SMS的API,具有分發這些短信併發送它們的工作。更好的是,爲了便於解決機器和軟件不完美的問題,並且閃電確實觸發了,我建議您將短信推送到某種後端數據存儲中,並將其留在那裏。後臺工作人員的工作/線程然後找到所有未發送的短信並嘗試發送它們(但發送不超過「x每分鐘」)的任務,每個完成後標記爲「發送」。

這有一個額外的好處,就是你可以在你的後備數據存儲器上拋出儘可能多的短信,如果機器死了,它可以繼續停止它,如果你有一些失敗,它們可以重試。

+0

Tnx爲答案。 例如我發送1短信,等待它收到,然後我發送第二,等待它收到,然後我發送第三和BOOM異常。在我的瀏覽器中,我按下了一秒鐘刷新(也許更少),並且效果很好(不等待到達)。 感謝您使用隊列的建議。但我正在爲我所能做的事情跳槽。你認爲這是可能的嗎?瀏覽器如何做到這一點? (chrome) – nzic

+0

請問你爲什麼要等待它被接收?短信不能即時傳送,可能需要過多的時間才能到達。因此,我建議使用一個數據庫,其中可以以請求不可知的方式維護傳輸狀態。我的猜測是,在你的代碼中,線程池被阻塞等待收到短信,而在你的瀏覽器中,沒有人等待其他人。只是猜測,在這一點上。 –

+0

你在我的代碼中誤解了我,我並不等待它。我在心理上等待它被接收。在上面的評論中,我發短信給自己,等待電話響起。 我的代碼是問題所以這是異步調用,我不在乎什麼是響應。 – nzic