【发布时间】:2013-10-15 22:21:55
【问题描述】:
我有一个在 MSMQ 中创建私人消息的 WCF 服务。消息创建良好,我可以看到我的客户端应用程序正在创建的消息。
我还有一个似乎运行良好的 MSMQ 侦听器服务。当我启动服务时,它似乎成功地“处理”了队列中的消息并且它们被删除了。但是,我的侦听器服务的实现似乎没有被执行。
我对 MSMQ 还很陌生,我不知道为什么要从队列中删除消息,以及为什么我的侦听器方法中的代码没有被执行。
以下是我的服务类...
[ServiceContract(Namespace = ServiceConstants.NAMESPACE, Name = "IOrderService")]
public interface IOrderQueueProcessingService
{
[OperationContract(IsOneWay = true, Action = "*")]
void ProcessOrderQueue(MsmqMessage<string> message);
}
public abstract class OrderQueueProcessingServiceBase : ServiceBase, IOrderQueueProcessingService
{
#region CONSTRUCTORS
protected OrderQueueProcessingServiceBase() { }
protected OrderQueueProcessingServiceBase(List<EventRecord> existingList) : base(existingList) { }
#endregion //CONSTRUCTORS
#region IOrderQueueProcessingService Members
[OperationBehavior(TransactionScopeRequired = false, TransactionAutoComplete = true)]
public virtual void ProcessOrderQueue(MsmqMessage<string> message)
{
throw new NotImplementedException();
}
#endregion
}
public class OrderQueueProcessingService : OrderQueueProcessingServiceBase
{
#region Constructors
public OrderQueueProcessingService() {}
public OrderQueueProcessingService(List<EventRecord> existingList) : base(existingList) { }
#endregion
/// <summary>
/// Processes any Orders in the Orders Queue
/// </summary>
/// <param name="message"></param>
public override void ProcessOrderQueue(MsmqMessage<string> message)
{
var q = new MessageQueue(@".\private$\msmqdemo/submitorderservice.svc");
q.Send("hey");
/*
using (new Tracer("OrderQueueProcessingService"))
{
// add data context to work with.
using (var unitOfWork = new TLFDataContext())
{
var newOrderLines = new List<OrderLineDataContract>
{
new OrderLineDataContract
{
C = "test",
IC = "msw",
Qty = 1,
T = "volume" ,
ED = DateTime.UtcNow.AddDays(5)
}
};
var newOrder = new OrderDataContract
{
LIs = newOrderLines.AsEnumerable(),
PId = 9323,
POId = 8686,
S = "new"
};
var orderService = new OrderService();
var createdOrder = orderService.CreateOrder(null, null, newOrder);
//unitOfWork.SubmitUnitOfWork();
//return null;
}
}*/
}
}
我注释掉了我最终尝试执行的代码,并将其替换为一个简单的 MSMQ 消息发送,以进行测试。这似乎应该可以正常工作。任何帮助将不胜感激。
下面的配置设置...
<service name="ServiceImplementation.OrderQueueProcessingService">
<host>
<baseAddresses>
<add baseAddress="https://localhost:9000/OrderQueueProcessingService.svc" />
</baseAddresses>
</host>
<endpoint address="net.msmq://localhost/private/testingqueue/OrderQueueProcessingService.svc" binding="netMsmqBinding" bindingConfiguration="MsmqBindingNonTransactionalNoSecurity" contract="IOrderQueueProcessingService" />
</service>
【问题讨论】:
-
.svclog告诉你什么?您是否通过浏览器访问了端点?那样有用吗?您是否使用 WCF 测试客户端访问了端点?这行得通吗? -
此外,如果您没有 .svclog 或任何其他类型的日志记录,并且您已将其设置为非事务性的,那么您很可能是“沉默”的受害者错误。”你怎么知道你的服务是否抛出异常?提示:您需要了解您的服务!
-
同意,对于非事务性队列,消息就消失了。您还可以启用日记功能:将 deadLetterQueue="System" 放入绑定配置中
-
感谢您的回复。我没有实现 .svclog。我测试它的一种方法是在我的服务构造函数中添加一个 EventLog。我正在使用自托管控制台应用程序在本地进行测试,并且该服务已实例化,并且没有问题地打开。如果我让它运行,并将消息添加到队列中,它们会立即从队列中删除,并放入日志消息中。我还在我的 ProcessOrderQueue 方法中添加了一个 EventLog,并且没有受到影响。所以我的操作(方法)永远不会被调用。我可以使用浏览器访问该服务。将尝试使用测试客户端进行测试。
-
顺便说一句,我在构造函数中的 EventLog 实际上确实创建了日志。
标签: c# wcf service listener msmq