[英]NetMQ - Communication between Wcf service to Windows Service?
我們在IIS中托管一個Wcf服務,該服務從許多客戶端(Web瀏覽器)接收HTTP請求。
Wcf服務必須執行許多操作:
因此,為了減輕我們的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.