C# NetMQ-Wcf服务与Windows服务之间的通信?
我们在IIS中有一个Wcf服务,它接收来自许多客户端(web浏览器)的http请求 Wcf服务必须执行许多操作: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请求后
- 将数据记录到数据库中
- 发送电子邮件
- 发送短信
- 检查FTP服务器
- 收集文件
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);
}
}
}
}
}