我们在IIS中有一个Wcf服务托管,它接收来自许多客户端(Web浏览器)的http请求。
Wcf服务必须执行许多操作:
因此,为了减轻我们的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);
}
}
}
}
}
致以最诚挚的问候,
塞德里克
答案 0 :(得分:1)
您将地址多次绑定(sender.Bind("tcp://*:5557");
)与到达wcf服务的每个请求。
只要请求不并行进入,这可能会起作用。但是当do,端口被多次绑定,这会给你看到的异常。
因此,为了避免该错误,您可以同步PushSocket
的创建和使用。也许使用一些锁定。
答案 1 :(得分:1)
您应该在活页夹和连接器之间切换。
静态拉套接字应该进行绑定,动态Pusher应该进行连接。
通过这种方式,您可以随意连接和断开任意数量的按钮,无需例外,您的拉出器将被绑定和收听。
你不应该 - 在generla中,特别是在这种情况下 - 使用锁定,因为这将违背zmq成为无臃肿的异步消息队列的目的