2013-05-11 21 views
5

Przy implementacji IStreamWriter i IHasOptions, które zwracają wynik image/jpeg, jeśli wystąpi błąd w WriteTo, globalna obsługa błędów w AppHost nie jest wywoływana, a nagłówek image/jpeg pozostaje, co powoduje błąd HTML (generowany przez ServiceStack) z nagłówkiem HTTP image/jpeg.Obsługa błędów za pomocą IStreamWriter & IHasOptions ServiceStack

Oto przykład, jak odtworzyć ten:

public class SampleStreamWriter : IStreamWriter, IHasOptions 
{ 
    void WriteTo(Stream responseStream) 
    { 
     // This would actually be a delegate 
     throw new ApplicationException("..."); 
    } 

    public IDictionary<string, string> Options 
    { 
     get 
     { 
      return new Dictionary<string, string> 
       { 
        {HttpHeaders.ContentType, "image/jpeg"} 
       }; 
     } 
    } 
} 

Od Opcji jest wywoływana przed writeTo, to nie jest możliwe, aby try/catch wewnątrz writeTo i zmienić Content-Type na przykład "application/json" i ręcznie zastąp odpowiedź błędu.

W jaki sposób można to zrealizować, aby odpowiedź HTTP zawierała wartość typu Content-Type błędu, a jako bonus, aby AppHost's ServiceExceptionHandler został wezwany do logowania?

Odpowiedz

2

Klasa CompressedFileResult może być dobrym przykładem do obejrzenia, ponieważ dziedziczy IStreamWriter i IHasOptions. Istnieje kilka innych klas używanych w testach dziedziczących po IStreamWriter (StreamWriterResult, ImageResult). Nie jestem pewien, czy są tak użyteczne.

Wygląda na to, że prostą odpowiedzią jest zrobienie wszystkiego (sprawdzanie poprawności, uzyskanie obrazu, budowa byte[], itd.) Przed wywołaniem metody "WriteTo". Jeśli Twoja usługa Try/Catch znajduje się w ramach usługi, możesz przekazać wyjątek i skorzystać z wcześniejszej obsługi wyjątków. Oczywiście to nie pomaga, gdy WriteTo rzuca wyjątek, ale w tym momencie w Pipeline wydaje się, że minąłeś punkt manipulacji Reagowania.

+1

Ma to sens; oznacza to, że istnieje kompromis pomiędzy przesyłaniem strumieniowym bezpośrednio do odpowiedzi lub lepszą obsługą błędów. Następnie powrócę do przywrócenia MemoryStream i napisania Response ContentType bezpośrednio w usłudze. Dzięki za pomoc! –

Powiązane problemy