2009-05-10 10 views
1

Um Streaming-Streaming zu unterstützen i Rückmeldung mit Überschreibung OnWriteBody ...
Das Problem ist, wenn eine Ausnahme in der OnWriteBody (DB Timeout oder welchen auch immer) geworfen wird
Die ProvideFault im IErrorHandler wird nicht aufgerufen und daher habe ich keine Möglichkeit den Fehler an den Client weiterzugeben (über eine Filterung im IErrorHandler).
Gibt es eine Möglichkeit, dies zu lösen.WCF- Fehlerbehandlung, wenn

Danke.

Antwort

0

Wenn ich Streaming mit WCF mache, erstelle ich zwei ServiceContracts, von denen einer das Streaming durchführt, das die Benachrichtigung am Ende des Streams sendet.

Die Antwort ServiceContract Ich verwende eine Duplex-Art Bindung. Der Client, der zuerst die Antwort ServiceContract aufruft, um ein Ticket für seine Transaktion zu erhalten, ruft dann meine Überweisung ServiceContract an. Am Ende der Transaktion wird der Client über den Erfolg oder Misserfolg von der Antwort ServiceContract benachrichtigt.



[ServiceContract] 
public interface IStreamFileService 
{ 
    [OperationContract] 
    void Upload(Stream stream); 
} 

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ITransferCallback))] 
public interface IStreamFileResponseService 
{ 
    [OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)] 
    Guid StartUpload(); 
} 

[ServiceContract] 
public interface ITransferCallback 
{ 
    [OperationContract] 
    void OperationComplete(ResponseMessage response); 
} 

Ich tue dies in zwei Dienste, weil meine Anforderungen und Workflow mir erfordert viele Dinge zu verfolgen und tun Authentifizierung, Validierung etc.

0

OnWriteBody aufgerufen wird, wenn Response-Header, wie 200 bereits an den Client gesendet wurde . Es ist unmöglich, Fehler in dieser Phase zu behandeln. Zwei Abhilfe/Tricks, die ich verwendet habe:

  1. Warten auf erste Datenreihe vor 200 Senden (wie vor der Nachricht zurückkehrt) und iterieren weitere Reihen innerhalb OnWriteBody. Dies funktioniert, weil die meisten SQL-Fehler und Timeouts vor dem Anzeigen von Daten auftreten. Es werden jedoch keine Fälle behandelt, in denen während der Ergebnissatziteration ein Fehler auftritt.
  2. Haben Sie einen speziellen Fehlerbehandlungscode auf Client und Server. Wie bei einem Fehler kann der Server innerhalb von OnWriteBody einen Fehler serialisieren und ihn als spezielle Datenzeile senden. Der Client sollte eine solche spezielle Datenzeile erwarten, während er eine Antwort erhält und entsprechend behandelt.