我使用.Net Framework 4.0开发了WCF自托管服务。
[ServiceContract(SessionMode=SessionMode.Required)]
[ServiceKnownType(typeof(XmlDocument))]
public interface IMyMSMQ
{
[OperationContract(IsOneWay=true, Action="*")]
void OnMessageReceived(MsmqMessage<XmlDocument> msg);
}
此接口的My Class实现如下所示。
public class MyMSMQ : IMyMSMQ, IErrorHandler
{
public void OnMessageReceived(MsmqMessage<XmlDocument> msg)
{
// Log Message To appropriate destination
Logger.LogMessage(msg);
}
}
我尝试了多种方案。
情景1:
场景#2:这与场景1类似,但启动应用程序的顺序不同
每次服务启动时,都会从队列中删除一条消息,因此看起来我的服务实际上正在读取消息,但它无法确定在何处发送消息或在读取消息时如何处理消息。
答案 0 :(得分:1)
我发现WCF库中的代码不是问题。这就是我定义端点绑定的方式。
MsmqIntegrationBinding binding = new MsmqIntegrationBinding(MsmqIntegrationSecurityMode.None);
binding.ReceiveTimeout = new TimeSpan(0, 1, 0); // set timeout to 1 minute.
binding.ReceiveErrorHandling = ReceiveErrorHandling.Fault;
this.AddServiceEndpoint(typeof(eRxMsmqWCF.IeRxMSMQ), binding, GetMQUri());
需要MsmqIntegrationBinding
(要求您包含以下使用声明:using System.ServiceModel.MsmqIntegration;
。
有时候我过分依赖intellisense。其他绑定所在的标准MsmqIntegrationBinding
下不存在System.ServiceModel
。所以我改用了NetMsmqBinding
。