2

MSMQ Web サービスを使用して、キューからデータを読み取り、データベースに保存しています。現在、Visual Studio 2010 を使用してサービスを実行しています (これは問題ですか?)。コード スニペットを以下に示します。

契約

[ServiceContract]
public interface IService1
{
    [OperationContract(IsOneWay = true,Action="*")]
    void DOWork(MsmqMessage<Param> p);
}

実装

public class Service1:IService1
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void DoWork(Param p)
    {
        new Service1BL().DoWork(p);
    }
}

設定

<service name="NameSpace.Service1" behaviorConfiguration="MSMQServiceBehavior">
                <endpoint address="net.msmq://localhost/private/Service1" binding="netMsmqBinding" bindingConfiguration="PoisonBinding" contract="IService1"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>

<behavior name="MSMQServiceBehavior">
    <serviceDebug includeExceptionDetailInFaults="true"/>
    <serviceMetadata httpGetEnabled="True"/>
   </behavior>

<netMsmqBinding>
                <binding name="PoisonBinding" receiveRetryCount="1" maxRetryCycles="5" retryCycleDelay="00:00:05" receiveErrorHandling="Fault">
                    <security mode="None"/>
                </binding>
            </netMsmqBinding>

追加情報

  • 異なるキュー名で試しました。.\Private$\Service1 と .\Private$\Service1.svc のように

    • メッセージ キュー、メッセージ キュー トリガー、Net.Msmq Listner アダプター、および WAS サービスが実行されている
    • メッセージをキューに明示的に挿入しています

--

MessageQueue queue = new MessageQueue(@".\private$\service1");
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
   queue.Send(p, MessageQueueTransactionType.Single);
   queue.Close();
   scope.Complete();
}

これは、別の Web サービスから MSMQ Web サービスを呼び出しているためです。MSMQ サービスを呼び出すと、メッセージがキューに挿入されるのではなく、MSMQ サービスが呼び出されていました。

4

2 に答える 2

4

キュー名の形式のスペルを確認してください。

それ以外の

MessageQueue queue = new MessageQueue(@".\private$\service1");

代わりにこれを試してください:

MessageQueue queue = new MessageQueue(@"FormatName:DIRECT=OS:YOURMACHINENAME\private$\service1");

... もちろん、 YOURMACHINENAME は、キューを保持しているマシンの名前に置き換える必要があります。:-)

最初の部分は大文字と小文字が区別されることに注意してください。

于 2012-10-15T12:16:04.203 に答える
1

これも機能すると思います(シングルバックスラッシュをダブルバックスラッシュに変更してください)。また、マシン名を使用する必要はありません(したがって、ローカルボックスからどこにでも移動するときに、コードを変更する必要はありません)。

MessageQueue queue = new MessageQueue(@".\\private$\\service1")
于 2012-10-17T21:25:31.060 に答える