MSMQ& WCF消息在专用队列中不可见

时间:2011-06-06 09:09:01

标签: wcf msmq

有几个与此类似的问题,我对MSMQ非常陌生。

我一直在尝试将ServiceContract和关联的DataContract链接到MSMQ,并设置了端点,以便DataContact消息以MSMQ结束。

我已经验证了WCF服务正确生成了消息,我还可以看到消息在我发送给的队列的日志中,但是在我希望它们的实际“排队消息”区域中没有

我目前没有使用交易,而且我已将安全性设置为无。我附上相关的代码,虽然我的感觉是我因为无知MSMQ而缺少一些基本的东西。任何指针都会受到赞赏。

服务&数据合同

[DataContract]
public class RegistrationMessage : IRegistrationMessage
{
    [DataMember]
    public string EMailAddress { get; set; }
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
}

[ServiceContract]
public interface IRegistration
{
    [OperationContract(IsOneWay = true)]
    void Register(RegistrationMessage message);
}

[DataContract] public class RegistrationMessage : IRegistrationMessage { [DataMember] public string EMailAddress { get; set; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } } [ServiceContract] public interface IRegistration { [OperationContract(IsOneWay = true)] void Register(RegistrationMessage message); }

WCF主机的app.config

2 个答案:

答案 0 :(得分:5)

我不知道WCF,但我可以对MSMQ方面发表评论。

  

“我已经确认消息是   由WCF正确生成   服务,我也可以看到   消息在日记中   队列我发送给,但不是在   我所在的实际排队消息区域   期待他们。“

这表示邮件已发送并处理完毕 与队列关联的日志消息仅在消息已传递然后由应用程序读取/接收时创建 如果消息刚刚发送但未读取/接收,则不会创建日志消息,原始消息将保留在目标队列中。
如果邮件已发送但随后被清除/删除,则不会创建日记邮件,因为应用程序未成功读取/接收原始邮件。

干杯
John Breakwell

答案 1 :(得分:2)

好吧,既然没有人能够回答消息被消费的原因,我在服务实现中编写了一个使用本机System.Messaging类的解决方法。这是一个遗憾,因为根据文档,人们应该能够在没有代码的情况下向队列发送消息(只要正确描述了端点)。

以下是我所使用的代码,适用于处于困境的任何人。

在主机控制台项目中,我通过注释掉net.msmq并添加wsHttpBinding来修改App.Config端点,使其成为常规的WCF服务。

        <services>
            <service behaviorConfiguration="MetaDataBehaviour" name="Client.AuthenticationService.RegistrationService">
<!--                <endpoint address="net.msmq://localhost/private/authenticationqueue"
                          binding="netMsmqBinding" 
                          bindingConfiguration="msmq" 
                          name="msmq"
                          contract="Global.DomainModel.IRegistration" /> -->
                <endpoint address="http://localhost:8080/Registration"
                          binding="wsHttpBinding"
                          bindingConfiguration=""
                          contract="Global.DomainModel.IRegistration" /> 
                <endpoint address="mex" 
                          binding="mexHttpBinding" 
                          name="mex" 
                          contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8080/Registration/" />
                    </baseAddresses>
                </host>
            </service>

在服务实现中,我添加了以下内容(保留原始的Console.WriteLine语句用于测试目的:

    public void Register(RegistrationMessage message)
    {
        MessageQueue queue = new MessageQueue(@".\private$\authenticationqueue");
        Message msg = new Message();
        msg.ResponseQueue = queue;
        msg.Label = "AuthenticationMessage";
        msg.Body = message;
        queue.Send(msg);
        Console.WriteLine("e-mail: " + message.EMailAddress);
        Console.WriteLine("First Name: " + message.FirstName);
        Console.WriteLine("Last Name: " + message.LastName);
    }

这完美地工作并且按预期工作,为队列提供保湿。现在我可以编写工作流基础服务来使用它。

感谢John确认消息实际上被消费的事实。我会给你投票,但我的水平太低了:)