簡體   English   中英

NetMQ-Wcf服務與Windows Service之間的通信?

[英]NetMQ - Communication between Wcf service to Windows Service?

我們在IIS中托管一個Wcf服務,該服務從許多客戶端(Web瀏覽器)接收HTTP請求。

Wcf服務必須執行許多操作:

  • 將數據記錄到數據庫中
  • 發電子郵件
  • 發簡訊
  • 檢查FTP服務器
  • 收集檔案
  • ...

因此,為了減輕我們的Wcf服務(不適用於長時間運行的線程工作),我們決定使用Wcf服務僅捕獲http請求並向Windows服務發送消息(使用NetMQ)以完成長時間工作。

為了評估體系結構,我們編寫了一個小演示(請參見代碼下方),但我們面臨一個問題。

實際上,在幾個HTTP請求從客戶端瀏覽器發送到Wcf服務之后,Wcf服務引發以下錯誤:

“通常只允許每個套接字地址(協議/網絡地址/端口)使用一種”

我想,我們對NetMq庫的使用不夠好。 有人可以建議我們這樣做嗎? 提前致謝。

Wcf服務代碼:

public class DataTrackService : IDataTrackService  
{
    public void PostData(Stream input) 
    { 
        using (StreamReader reader = new StreamReader(input, Encoding.UTF8)) 
        { 
            string workload = reader.ReadToEnd(); 
            try 
            { 
                Task.Factory.StartNew(() => 
                { 
                    using (NetMQContext ctx = NetMQContext.Create()) 

                    { 
                        using (var sender = ctx.CreatePushSocket()) 

                        { 
                            sender.Bind("tcp://*:5557"); 
                            sender.Send(workload); 
                        } 

                    } 

                }); 
            } 
            catch (Exception ex) 
            { 
                throw ex; 
            } 
            return; 
    } 
 } 

窗口服務代碼(由控制台應用程序模擬):

static void Main(string[] args)       
{
       using (NetMQContext ctx = NetMQContext.Create())
       {
           //socket to receive messages on
           using (var receiver = ctx.CreatePullSocket())
           {
               receiver.Connect("tcp://localhost:5557");

               //process tasks forever
               while (true)
               {
                   string workload = receiver.ReceiveString();

                   Console.WriteLine("receiver : " + workload);

               }
            }
        }
    }
}

最好的祝福,

塞德里克

您將每個到達wcf服務的請求都多次綁定地址( sender.Bind("tcp://*:5557"); )。

只要請求不是並行進行的,這可能會起作用。 但是,執行此操作時,端口將被綁定成乘,這會給您帶來您所看到的異常。

因此,為了避免該錯誤,您可以同步PushSocket的創建和使用。 也許使用一些鎖定。

您應該在活頁夾和連接器之間切換。

靜態拉式插座應進行綁定,而動態推式按鈕應進行連接。

這樣一來,您就可以隨意連接和斷開任意數量的推子,並且無一例外,同時您的推子將被綁定並監聽。

您不應該-在一般情況下-特別是在這種情況下-請使用鎖定,因為那樣會違背zmq的目的,使其成為一個不會中斷的異步消息隊列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM