0

私は、着信メッセージを処理し、そこに含まれる XML を解析し、データをデータベース テーブルに転記する C# WCF サービスを作成しました。

WCF MSMQ サービスの実装をホストする Windows サービスを開始すると、1 つのメッセージが正常に処理された後、停止します。

これは、名前の変更を開始するまで、キュー内のすべてのメッセージを処理するために使用されていました。それは呼び出されるので、私は少し途方に暮れていますが、一度だけです。イベント ログにエラーは記録されません。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);
  }
}
4

1 に答える 1

2

問題はバッファサイズでした

初めて実行されたのではなく、一度実行されました。

私のテスト ケースで使用されるメッセージ ジェネレーターは、たまたま 2 つの大きなメッセージと 1 つの小さなメッセージ (16K) を生成するように構成されています。小さな例外は正常に処理されていましたが、大きな例外が発生するとすぐに致命的な例外が発生し、Windows サービス ホスト プロセスの待機スレッドを停止することなく WCF サービスが中断されました。

さまざまなバッファサイズを増やすと、問題は完全に解決しました。同様の動作が見られる場合は、ReaderQuotas 設定とバインディング maxReceivedMessageSize にアクセスしてください。WCF Config Editor を使用すると、これが簡単になります。

<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 にあるため、どのようにシステムに組み込まれたかはわかりませんが、Google または Bing が役立つことは間違いありません。まだ持っていません。

于 2012-06-14T12:20:49.693 に答える