2012-10-12 5 views
2

MSMQ 웹 서비스를 사용하여 큐에서 데이터를 읽고이를 데이터베이스에 저장합니다. 현재 Visual Studio 2010을 사용하여 서비스를 실행 중입니다 (문제입니까?). 코드 스 니펫은 아래에 있습니다.MSMQ 서비스가 큐를 읽지 않습니다.

계약

[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> 

추가 정보

  • 다른 대기열 이름으로 시도했습니다. 처럼. \ 개인 $ \ 서비스 1과 . \ 개인 $ \ Service1.svc

    • 메시지 큐, 메시지 큐 트리거, Net.Msmq의 청취자 어댑터와 서비스는 내가 명시 적으로 메시지를 삽입하고
    • 을 실행하는 WAS 큐

-

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

생하는 이유 MSMQ 웹 서비스를 다른 웹 서비스에서 호출하려고합니다. MSMQ 서비스를 호출 할 때 메시지를 대기열에 삽입하는 대신 MSMQ 서비스를 호출했습니다.

답변

3

대기열 이름 형식의 철자를 확인하십시오. 대신 대신이 시도해야

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

:

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

... YOURMACHINENAME 필요한 경우, 물론, 큐를 보유하고있는 기계의 이름으로 대체합니다. :-)

첫 번째 부분은 입니다.입니다.

1

나는 이것이 (백 슬래시를 이중으로 바꾸기 위해 단일 백 슬래시를 변경하는 것만 큼) 잘 될 것이라고 믿는다. 그리고 기계 이름을 사용할 필요가 없습니다 (로컬 상자에서 어디로 옮길 때 코드를 변경할 필요가 없습니다).

MessageQueue queue = new MessageQueue(@".\\private$\\service1") 
관련 문제