2009-12-15 13 views
9

Sto cercando di gestire i messaggi non elaborabili in WCF con trasporto MSMQ.Gestione messaggi non elaborati in WCF MSMQ 4.0

Ho seguito il link sottostante per creare i servizi originali e antiveleno.

http://msdn.microsoft.com/en-us/library/aa395218.aspx

L'unica differenza è invece di sé hosting, ho ospitato i 2 servces in IIS con un unico progetto di accoglienza.

La configurazione di entrambi i servizi è riportata di seguito.

<services> 
    <service behaviorConfiguration="MainMSMQWCFService.Service1Behavior" 
    name="MainMSMQWCFService.OrderProcessorService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison" 
     binding="netMsmqBinding" bindingConfiguration="PoisonBinding" 
     contract="MainMSMQWCFService.IOrderProcessor" /> 
    </service> 
    <service behaviorConfiguration="MainMSMQWCFService.PoisonHandlingServiceBehavior" 
    name="MainMSMQWCFService.PoisonHandlingService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison;poison" 
       binding="netMsmqBinding" 
       bindingConfiguration="PoisonBinding2" 
       contract="MainMSMQWCFService.IOrderProcessor"> 
    </endpoint> 
    </service> 
</services> 

Entrambi i servizi funzionano correttamente.

Il problema è quando il messaggio viene inserito nella coda velenosa, il servizio veleno non sta elaborando il messaggio. Ho osservato i messaggi nella coda Poison, che hanno come target solo il servizio originale. allora come può trattarli il servizio avvelenato? dopo aver esplorato MSDN, ho avuto modo di sapere che impostando l'attributo Comportamento del servizio, il canale WCF si occupa di questo problema. Il seguente paragrafo spiega lo stesso.

"I messaggi nella coda dei messaggi non elaborati sono messaggi indirizzati al servizio che elabora il messaggio, che potrebbe essere diverso dall'endpoint del servizio messaggi non codificati. Pertanto, quando il servizio messaggi non elaborati legge i messaggi dalla coda, Il livello canale WCF trova la mancata corrispondenza tra i punti finali e non invia il messaggio, in questo caso il messaggio viene indirizzato al servizio di elaborazione degli ordini ma viene ricevuto dal servizio messaggi non elaborati. Per continuare a ricevere il messaggio anche se il messaggio è indirizzato a un endpoint diverso, è necessario aggiungere un comportamento di servizio per filtrare gli indirizzi in cui il criterio di corrispondenza deve corrispondere a qualsiasi endpoint del servizio a cui è indirizzato il messaggio. Ciò è necessario per elaborare correttamente i messaggi letti dalla coda dei messaggi non elaborati. "

Ma il mio servizio veleno non sta elaborando i messaggi avvelenati?

Non riesco a capire il problema.

+0

Hmmmm, è possibile ospitare solo i binding http in IIS. Intendi? –

risposta

4

Ho lo stesso problema.

Mi chiedevo se è perché quando si ospitano i servizi netMsmq in IIS, il nome della coda deve corrispondere al nome del servizio. Nel caso della coda dei messaggi iniziale, questo è OK (ad esempio la coda sarebbe qualcosa di simile a private/SimpleService/Service1.svc), ma la coda velenosa viene chiamata private/SimpleService/Service1.svc; veleno, che ovviamente non abbinare il nome del servizio veleno.

Ho avuto campioni che funzionano bene quando si è ospitato autonomamente. Questo problema sembra essere solo con l'hosting IIS.

Se questo è il problema, allora non ho una soluzione ho paura ...

Aggiornamento:

Questo commento da

http://msdn.microsoft.com/en-us/library/ms789042(v=VS.90).aspx

suggerisce che il problema è come Ho pensato:

"Un'applicazione ospitata da WAS non può essere attivata in base ai messaggi in una coda di sistema, come la system-wid La coda di messaggi non recapitabili o le code secondarie, come le code secondarie velenose.Questa è una limitazione per questa versione del prodotto"

Non credo sia possibile specificare una coda di messaggi non elaborabili alternativa personalizzato, quindi le alternative sono:

1) scrivere codice per l'attuazione del servizio di spostare i messaggi su una coda alternativa in caso di errore 2) Utilizzare un trigger per trasferire i messaggi dalla coda dei messaggi non codificati a un'altra coda e disporre di un servizio ospitato da IIS per ascoltare quello 3) Ospitare il servizio messaggi non elaborati in un EXE personalizzato anziché IIS

+0

Microsoft dovrebbe aggiungere la funzione ** coda dei messaggi velenosi ** nel collegamento net.msmq –

2

Recentemente mi sono imbattuto in questo con IIS 7. Sì, per impostazione predefinita, l'applicazione ospitata da WAS non funziona sulle code velenose Tuttavia, I Belie C'è un modo per ospitare il servizio WCF in IIS che rileverà i messaggi velenosi. Il modo in cui penso è che il servizio di messaggi velenosi è in realtà un sottoservizio del servizio WCF principale ed è in qualche modo dipendente dal servizio principale. Per ospitare il sottoservizio in WCF, ho implementato ServiceHostFactory personalizzato. All'interno di ServiceHostFactory, eseguo l'override degli eventi OnOpening e OnClosing dell'host del servizio principale per aprire e chiudere il servizio di messaggi non elaborabili. Ecco un esempio di codice:

public class HostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     SomeServiceHost host = new SomeServiceHost(serviceType, baseAddresses); 
     host.PoisonMsmqServiceType = typeof(PoisonHandler); 
     return host; 
    } 
} 

public class SomeServiceHost : ServiceHost 
{ 
    private ServiceHost poisonMsmqServiceHost; 


    public Type PoisonMsmqServiceType { get; set; } 

    public SomeServiceHost(Type serviceType, params Uri[] baseAddresses) 
    : base(serviceType, baseAddresses) { } 

    protected override void OnOpening() 
    { 
     base.OnOpening(); 

     if (this.PoisonMsmqServiceType != null) 
     { 
      this.poisonMsmqServiceHost = new ServiceHost(this.PoisonMsmqServiceType); 
      this.poisonMsmqServiceHost.Open(); 
     } 
    } 

    protected override void OnClosing() 
    { 
     base.OnClosing(); 

     if (this.poisonMsmqServiceHost != null) 
     { 
      this.poisonMsmqServiceHost.Close(); 
      this.poisonMsmqServiceHost = null; 
     } 
    } 
} 

Dopo di che, è sufficiente impostare l'attributo 'Factory' su di voi .SVC file con la classe factory host personalizzato e dovrebbe prendersi cura della gestione per voi messaggio veleno.

Problemi correlati