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

C# NetMQ-Wcf服务与Windows服务之间的通信?,c#,wcf,communication,netmq,C#,Wcf,Communication,Netmq,我们在IIS中有一个Wcf服务,它接收来自许多客户端(web浏览器)的http请求 Wcf服务必须执行许多操作: 将数据记录到数据库中 发送电子邮件 发送短信 检查FTP服务器 收集文件 因此,为了减轻我们的Wcf服务(它不适合长时间运行的线程工作),我们决定使用Wcf服务仅捕获http请求并向windows服务发送消息(使用NetMQ)以完成长时间的工作 为了评估体系结构,我们编写了一个小演示(见下面的代码),但我们面临一个问题 实际上,在从客户端浏览器向Wcf服务发送多个http请求后

我们在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; 
    } 
 } 
窗口服务代码(由控制台应用程序模拟):

致以最良好的祝愿


Cedric

您正在对每个到达wcf服务的请求多次绑定地址(
sender.Bind(“tcp://*:5557”);

只要请求不是并行的,这可能会起作用。但是当请求并行时,端口绑定成倍增加,这会给您带来您看到的异常


因此,为了避免该错误,您可以同步创建和使用
推送插座。
。可能需要使用一些锁定。

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

静态拉线插座应进行绑定,动态推杆应进行连接

这样,您可以连接和断开任意次数和任意数量的推送器,而您的拉送器将始终处于绑定和侦听状态

一般情况下,尤其是在本例中,您不应该使用锁定,因为这将违背zmq作为无阻塞异步消息队列的目的

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);

               }
            }
        }
    }
}