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 サービスが呼び出されていました。