首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSMQ,消息被放在队列中并被删除,但服务契约却从不接收消息。

MSMQ,消息被放在队列中并被删除,但服务契约却从不接收消息。
EN

Stack Overflow用户
提问于 2012-07-25 07:57:11
回答 2查看 1.4K关注 0票数 2

我有一个本地的私人队列。我还在一个MVC应用程序中有一个WCF服务,它使用msmqIntegrationBinding侦听队列。问题是,当消息排队时,服务契约从未被调用过,但是消息在那一刻就被拒绝了。消息不在毒队列中。下面是我声明绑定到队列的config-部分:

代码语言:javascript
复制
<services>
  <service name="SkruvInfo.Web.Service.QueueMessageReceiver">
    <endpoint address="msmq.formatname:DIRECT=OS:LEIA\private$\screwinfo_autotests_messagequeue"
                      binding="msmqIntegrationBinding"
                      bindingConfiguration="MsmqBinding"
                      contract="SkruvInfo.Web.Service.IQueueMessageReceiver" />
  </service>
</services>

这是合同:

代码语言:javascript
复制
[ServiceContract(Namespace = "http://localhost/SkruvWeb/Service")]
public interface IQueueMessageReceiver
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void PutScrewInfoMessage(MsmqMessage<string> msg);
}

以下是服务中的方法:

代码语言:javascript
复制
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void PutScrewInfoMessage(System.ServiceModel.MsmqIntegration.MsmqMessage<string> msg)
    {
        log4net.Config.XmlConfigurator.Configure();
        var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        try
        {
            log.Debug("Message from queue: " + msg.Body.ToString(CultureInfo.InvariantCulture));
            var xDoc = new XmlDocument();
            xDoc.LoadXml(msg.Body);
            CacheScrewInfoModelFromScrewInfoXmlDoc(xDoc);
        }
        catch (Exception e)
        {
            log.Error("Error parsing message from queue",e);
            EventLog.WriteEntry("Application","Message error for screws");
        }
    }

对于为什么消息拒绝而不调用服务有任何建议吗?

EN

回答 2

Stack Overflow用户

发布于 2012-07-25 09:16:20

尝试使用ServiceKnownType属性修改您的服务合同:

代码语言:javascript
复制
[ServiceContract(Namespace = "http://localhost/SkruvWeb/Service")]
[ServiceKnownType(typeof(String))]
public interface IQueueMessageReceiver
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void PutScrewInfoMessage(MsmqMessage<string> msg);
}

更新

如果您正在使用MsmqIntegrationBinding,那么我假设您的队列客户端是一个像VB6客户端一样的遗留应用程序?如果是,则需要在服务绑定配置中指定序列化格式。例如:

代码语言:javascript
复制
  <msmqIntegrationBinding>
    <binding name="MsmqBinding" serializationFormat="ActiveX">
      <security mode="None" />
    </binding>
  </msmqIntegrationBinding>

允许的值是文档化的这里

票数 1
EN

Stack Overflow用户

发布于 2013-06-24 12:27:05

在我的经验中,这种行为是由序列化失败或消息大(64 In是默认的最大消息大小)引起的。这会导致WCF无声崩溃(是的,我也不理解这种设计选择),但仍然将消息从队列中删除。

只需启用跟踪,您将很快在WCF中看到导致这种情况的异常。

将其添加到您的web.config (我在下面)以进行粗略的跟踪设置。确保AppPool用户对日志记录文件夹有写访问权。

代码语言:javascript
复制
<system.diagnostics>
    <trace autoflush="true" indentsize="4" />
    <sources>
      <source name="System.ServiceModel" switchValue="Warning">
        <listeners>
          <add name="textLogger" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="textLogger"
           type="System.Diagnostics.TextWriterTraceListener"
           initializeData="C:\logs\webbackend_wcf_log.txt" />
</system.diagnostics>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档