2013-05-16 3 views
2

Я пробовал реализовать пользовательский форматтер для возврата документов PDF из ServiceStack. Однако без большой удачи. Я просмотрел примеры и в значительной степени скопировал образец VCard, но заменил его своим кодом. Моя форматировщик выглядит примерно так:Обратные документы PDF

public class PdfFormatter 
{ 
    private const string PdfFormatContentType = "application/pdf"; 

    public static void Register(IAppHost appHost) 
    { 
     appHost.ContentTypeFilters.Register(PdfFormatContentType, SerializeToStream, (t, s) => { throw new NotImplementedException(); }); 
    } 

    public static void SerializeToStream(IRequestContext requestcontext, object dto, Stream outputstream) 
    { 
     ... 
    } 
} 

Я под названием реестр от моего AppHost и Content Type Filter добавляется, как ожидалось. Моя проблема заключается в том, что SerializeToStream вызывается только при доступе к метаданным для моих методов. Когда я вызываю конкретный метод на служебной программе, возвращается ответ HTML.

URL, вызываемый: http://mydomain.com/api/pdf/reply/GenerateDocument

заголовки запроса выглядит следующим образом:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,da;q=0.6 
Cache-Control:max-age=0 
Connection:keep-alive 
Host:mydomain.com 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 

Заголовки ответа выглядеть следующим образом:

Cache-Control:private 
Connection:Close 
Content-Length:46 
Content-Type:application/pdf; charset=utf-8 
Date:Thu, 16 May 2013 19:59:27 GMT 
Server:ASP.NET Development Server/11.0.0.0 
X-AspNet-Version:4.0.30319 
X-Powered-By:ServiceStack/3,945 Win32NT/.NET 

Ответ на самом деле PDF, но отладчик не разбивается на SerializeToStream.

Любая помощь будет оценена по достоинству.

ответ

0

После регистрации Content-Type клиенту по-прежнему необходимо сообщить ServiceStack, что он хочет тип содержимого PDF.

Вы можете сделать это на веб-сайте:

http://example.org/myservice?format=pdf 

через pre-defined route:

http://example.org/pdf/reply/GenerateDocument 

Или в HTTP Accept заголовок, например:

GET /myservice 
Host: example.org 
Accept: application/pdf 
+0

Я пытался что и это не имеет значения. При запросе http: // localhost/api/pdf/metadata? Op = GenerateDocument вызывается SerializeToStream, но при вызове http: // localhost/api/pdf/reply/GenerateDocument? Format = pdf SerializeToStream не вызывается. – ThomasArdal

+0

Можете ли вы предоставить полный HTTP-запрос и ответ (используя Fiddler/WebInspector или WireShark и т. Д.), Чтобы мы могли видеть, что происходит? – mythz

+0

URL запроса: HTTP: // локальный:/GenerateDocument формат 36386/API/PDF/ответ = PDF Запрос Метод: GET Код Статус: 200 OK – ThomasArdal

Смежные вопросы