NetMQ - Wcf服务与Windows服务之间的通信?

时间:2014-12-31 14:58:44

标签: c# wcf communication netmq

我们在IIS中有一个Wcf服务托管,它接收来自许多客户端(Web浏览器)的http请求。

Wcf服务必须执行许多操作:

  • 将数据记录到数据库中
  • 发送电子邮件
  • 发送短信
  • 检查FTP服务器
  • 收集档案
  • ...

因此,为了减轻我们的Wcf服务(不适合长时间运行的线程工作),我们决定使用Wcf服务仅捕获http请求并向Windows服务发送消息(使用NetMQ)以便执行此操作长期的工作。

为了评估架构,我们编写了一个小型演示(见下面的代码),但我们遇到了一个问题。

实际上,在从客户端浏览器向Wcf服务发送多个http请求之后,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);

               }
            }
        }
    }
}

致以最诚挚的问候,

塞德里克

2 个答案:

答案 0 :(得分:1)

您将地址多次绑定(sender.Bind("tcp://*:5557");)与到达wcf服务的每个请求。

只要请求不并行进入,这可能会起作用。但是当do,端口被多次绑定,这会给你看到的异常。

因此,为了避免该错误,您可以同步PushSocket的创建和使用。也许使用一些锁定。

答案 1 :(得分:1)

您应该在活页夹和连接器之间切换。

静态拉套接字应该进行绑定,动态Pusher应该进行连接。

通过这种方式,您可以随意连接和断开任意数量的按钮,无需例外,您的拉出器将被绑定和收听。

你不应该 - 在generla中,特别是在这种情况下 - 使用锁定,因为这将违背zmq成为无臃肿的异步消息队列的目的