2016-03-24 13 views
0

Ich teste die Ausnahmebehandlung meiner BizTalk 2010-Orchestrierung. Die Orchestrierung hat eine Bereichsform, an die eine Fangform angehängt ist. Der Transaktionstyp des Bereichs Shape ist auf 'NONE' festgelegt, sodass ich mit der .NET-Ausnahme arbeiten kann. Innerhalb des Fangs befindet sich eine Konstruktnachrichtenform mit einer Nachrichtenzuweisungsform. Die Nachrichtenzuordnungsform verwendet den aktiven Nachrichtentyp aus der Empfangsform.Warum ist system.exception in Nachrichtenform nicht serialisierbar?

Wenn die Orchestrierung ausgeführt wird, wird sie beim Senden der Nachrichtenform ausgesetzt. Der Fehler ist:

Typ System.Xml.XmlDocument in Assembly System.Xml, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = xxx ist nicht als serialisierbar markiert.

Mein Projekt so eingerichtet ist, dass ich zu Testzwecken entweder eine eingehende BizTalk-Nachricht oder eine XML-Datei (über den Test-Editor.) verarbeiten kann ich die XML nehmen kann, der die Form erhält vorgelegt wird, speichern es als XML-Datei und verarbeiten Sie die XML-Datei.

Um die Ausnahmebehandlung zu testen, habe ich absichtlich einen Datenbankeinsatz codiert, der fehlschlägt. Der vollständige Datenbankfehler wird in eine Protokolldatei geschrieben, und eine neue Ausnahme wird mit folgender Meldung ausgelöst: Fehler beim Verarbeiten der BLAH-Anforderung - Nachrichtsprozessor - Bild ID: ABC Hinweis-ID: XYZ. Beim Ausführen der XML-Datei löst die Anwendung den Fehler an der erwarteten Stelle aus und der Fehler wird im Testeditor abgefangen. Ich bin in der Lage, die Fehlermeldung in der Test-Editor-Funktion zu serialisieren.

Beim Ausführen von BizTalk bekomme ich jedoch den Fehler. Ein Korrelationssatz wurde mit diesen Eigenschaften definiert: BTS.ReceivePortName, ErrorReport.ErrorType, ErrorReport.InboundTransportLocation.
Der Code in der Zuweisungsform lautet wie folgt.

msgFail = InputMsg; 
msgFail(ErrorReport.ErrorType) = "FailedMessage"; 
msgFail(ErrorReport.Description) = ex.Message; 
msgFail(ErrorReport.FailureCategory) = 0; 
msgFail(ErrorReport.FailureCode) = ""; 
msgFail(ErrorReport.InboundTransportLocation) = InputMsg(BTS.InboundTransportLocation); 
msgFail(ErrorReport.RoutingFailureReportID) = System.Convert.ToString(System.Guid.NewGuid()); 

msgFail ist die Nachricht, die ich senden möchte.

InputMsg ist der aktive Nachrichtentyp aus der ursprünglichen Empfangsform. Es ist ein mehrteiliger Nachrichtentyp, der an ein validiertes Schema gebunden ist.

ex ist der exception object Name in der Fangform. Es ist vom Typ System.Exception.

Ich habe viele Beiträge darüber gelesen, wie die Eigenschaften für den Bereich festgelegt und Formen abgefangen werden, um das Ausnahmeobjekt verwenden zu können, aber es funktioniert immer noch nicht.
Ich mache eine Annahme, dass, da ich die Fehlermeldung serialisieren kann, wenn von der XML-Datei ausgeführt wird, dass mein Problem damit ist, wie meine Orchestrierung die Ausnahme erhält.

+0

Sind Sie sicher, dass es eine Vanille-Ausnahme ist? –

+0

@SOreadonthelp, Danke. Nicht sicher, was du mit "Vanille" meinst. Wenn die einzige Änderung, die ich an der eingehenden Nachricht mache, darin besteht, den Kommentartext unter der Max für die Datenbankspalte zu haben, läuft die Orchestrierung vollständig ab und sendet ihre Nachricht an das externe System, so dass ich ziemlich sicher bin, wann und wie die Ausnahme ist wird geworfen. – ktri

+0

Sie müssten das Exception-Objekt ex nur im Handler selbst und nicht auf der Scope-Ebene definieren. Die Serialisierungswarnung bezieht sich jedoch nicht auf eine Ausnahme (Titel), sondern auf XmlDocument, die gut verstanden wird. Könntest Du das erläutern? –

Antwort

0

Wenn Sie das ESB Toolkit installiert haben, können Sie damit Ihre Fehlermeldungen erstellen.

e.

g
eSBFault = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage(); 
eSBFault.FailureCategory= "General System Exception"; 
eSBFault.FaultCode = "500"; 
eSBFault.FaultDescription = orchestrationName + ": " + ex.Message; 
eSBFault.FaultSeverity = Microsoft.Practices.ESB.ExceptionHandling.FaultSeverity.Error; 
eSBFault.Scope = "Scope Name"; 
Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.AddMessage(eSBFault, InputMsg); 

Anmerkung 1: orchestrationName ist eine Variable, die

orchestrationName = Microsoft.XLANGs.Core.Service.RootService.Name; 

Anmerkung 2 früher in der Besetzung festgelegt wurde: Ihr msgFail ist eSBFault in diesem Beispiel, aber man kann es auch nennen msgFail. Es ist der Nachrichtentyp Microsoft.Practices.ESB.ExceptionHandling.Schemas.Faults.FaultMessage

Verwandte Themen