WCF MSMQ只触发一次

时间:2012-06-04 13:59:18

标签: c# wcf msmq

我写了一个C#WCF服务,它应该处理传入的消息,解析它们包含的XML并将数据转录到数据库表。

当我启动承载我的WCF MSMQ服务实现的Windows服务时,它会成功处理一条消息,然后停止。

这用于处理队列中的所有消息,直到我开始重命名。我有点失落,因为它确实被调用 - 但只有一次。事件日志中不记录任何错误。 Window Service主机继续运行,并迅速响应SCM的服务停止指令。

  <netMsmqBinding>
    <binding name="Binding.MSMQ.TransportSecurity" maxReceivedMessageSize="32767">
      <readerQuotas maxBytesPerRead="32767" maxStringContentLength="32767" maxArrayLength="32767"/>
      <security mode="Transport">
        <transport msmqAuthenticationMode="None" msmqEncryptionAlgorithm="RC4Stream"
            msmqProtectionLevel="None" msmqSecureHashAlgorithm="Sha1" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>
  </netMsmqBinding>

...

<services>
  <service behaviorConfiguration="Behavior.CommonSense.ChapterWriter"
    name="CommonSense.ChapterWriter">
    <endpoint address="net.msmq://localhost/private/bob.logwriter"
      binding="netMsmqBinding" bindingConfiguration="Binding.MSMQ.TransportSecurity"
      name="Endpoint.CommonSense.ChapterWriter.msmq" contract="CommonSense.IChapterWriter">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/CommonSense/ChapterWriter/" />
      </baseAddresses>
    </host>
  </service>
</services>

...

using System.ServiceModel;

namespace CommonSense
{
  [ServiceContract]
  public interface IChapterWriter
  {
    [OperationContract(IsOneWay = true)]
    void Write(string xml);
  }
}

1 个答案:

答案 0 :(得分:2)

问题是缓冲区大小

第一次没有运行 ,它正在运行一次

我的测试用例中使用的消息生成器恰好配置为生成两个大消息和一个小消息(16K)。小的一个正常处理,一旦遇到一个大的异常会导致WCF服务脱轨而不停止Windows服务主机进程的等待线程。

增加各种缓冲区大小可以完全解决问题。如果您看到类似的行为,请访问ReaderQuotas设置和绑定maxReceivedMessageSize。 WCF配置编辑器使这很容易。

<netMsmqBinding> 
  <binding name="Binding.MSMQ.TransportSecurity" maxReceivedMessageSize="65535"> 
    <readerQuotas 
      maxBytesPerRead="65535" 
      maxStringContentLength="65535" 
      maxArrayLength="65535"/> 
    <security mode="Transport"> 
      <transport msmqAuthenticationMode="None" msmqEncryptionAlgorithm="RC4Stream" 
          msmqProtectionLevel="None" msmqSecureHashAlgorithm="Sha1" /> 
      <message clientCredentialType="Windows" /> 
    </security> 
  </binding> 
</netMsmqBinding> 

WCF配置编辑器

我不能足够推荐这个工具。虽然我已经很好地了解了如何配置WCF,但是在没有意外遗漏的情况下进行电路板放置是有价值的,因为在引用名称时不可能错误地输入名称。

此工具存在于Visual Studio的“工具”菜单中,但是exe的路径位于Windows SDK中,因此我不确定它是如何进入我的系统的,但我确信谷歌或者Bing可以帮助您如果你还没有它。