Domanda

Ho un BizTalk 2006 app che ha una SendPort utilizzando MSMQ.

Ho anche un WCF WinForms ospitare app con diversi servizi WCF (nell'ambiente di sviluppo, nella produzione di uso un servizio di Windows come hosting).

Uno dei servizi WCF che ho creato ha una MsmqIntegrationBinding (a causa del fatto che BizTalk non è un servizio WCF, quindi NetMSMQBinding non è possibile).

Vedo che il messaggio sia correttamente posizionato sulla coda remota perché ho attivato l'opzione giornale e vedo il messaggio nella coda ufficiale, ma la coda è vuota e il servizio WCF non raccoglie il messaggio.

Qualcuno mi può dare un indizio dove guardare per risolvere questo problema?

(Modifica 1): Ho fatto qualche ricerca su questo argomento:

  • Quando si comunica con BizTalk 2006 R2 con MSMQ è necessario utilizzare MsmqIntegrationBinding perché NetMSMQBinding è solo per WCF-to-WCF
  • Quindi sono stucked a MsmqIntegrationBinding
  • l'associazione non usa DataContract serializzatore MSMQIntegration. Invece, serializza i dati in base alla proprietà MsmqMessageSerializationFormat. Il valore predefinito per è MsmqMessageSerializationFormat.Xml che significa che XmlSerializer verrà utilizzato. La logica alla base di questo è che il trasporto di integrazione MSMQ è progettato specificamente per interoperabilità con le applicazioni MSMQ / System.Messaging nativi
  • Perché il legame MSMQIntegration utilizza la pianura vecchio XmlSerializer, non ho la facile possibilità di utilizzare lo Svcutil.exe per generare i miei classi di dati. Quindi devo creare le mie classi DataContract a mano .... pfffffffffff

(riferimento: http: //social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1 e http://www.danrigsby.com/blog/index.php/2008/03/07 / XmlSerializer-vs-DataContractSerializer-serializzazione-in-WCF / )

(Modifica 2):

Ho controllato i dati di traccia di diagnostica dal servizio WCF e il messaggio è stato abbandonato a causa di un'eccezione deserializzazione. L'unica soluzione è ora quello di creare la classe DataContract a mano ...

(Modifica 3): utilizzando lo strumento xsd.exe invece del Svcutil.exe ho creato la classe DataContract, quindi nessun lavoro artigianale qui ;-) Quindi la conclusione è quella di utilizzare xsd.exe per le classi di contratto dati che sono utilizzato come parametro nel metodo di servizio WCF. Questo perché MsmqIntegrationBinding forze di effettuare tutti i tipi DataContract come serializzabile con la XMLSerializer posto del default DataContractSerializer.

È stato utile?

Soluzione

Si consiglia di provare ad attivare WCF Tracing.

Può aiutare a capire cosa sta succedendo, e che cosa non sta accadendo.

Il seguente è un esempio .config per attivare l'analisi. Assicurarsi che il file .config si trova nella stessa cartella del vostro ospite servizio WCF.

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" 
              propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\trace_logs\TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Microsoft fornisce una Servizio di traccia strumento Visualizzatore per leggere i file .svclog.

Assicurarsi che il percorso in initializeData è scrivibile dal servizio.

Altri suggerimenti

La prima cosa da controllare è qui i diritti del servizio WCF. È il collegamento alla coda messaggio che viene fatto da un account a cui è consentito di collegarsi alla coda di messaggi.

Può anche essere a causa di un errore di configurazione, è la configurazione corretta connessione?

Controllare il registro eventi, ci può essere un errore là, che si punta nella giusta direzione.

Hai verificato se il messaggio è infatti lasciato in coda dal servizio WCF, o è in fase di raccolto e cancellati e proprio non trattati da WCF?

Qualcosa mi piacerebbe provare annette un gestore per il UnknownMessageReceived evento nell'istanza ServiceHost e vedere se è in fase attiva quando il messaggio viene raccolto ... che sarebbe un segno sicuro il vostro contratto di servizio è definito in modo errato (potrebbe essere necessario utilizzare un fermo tutti:

[OperationContract(Action="*")]

Per garantire che venga correttamente indirizzato al metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top