Прикрепление файлов к ответам службы WCF REST - PullRequest
5 голосов
/ 07 июня 2010

У меня есть ресурс, который выглядит примерно так:

/users/{id}/summary?format={format}

Когда format равен "xml" или "json", я отвечаю с помощью объекта сводки пользователя, который автоматически кодируется WCF - такдалеко.Но когда format равно "pdf", я хочу, чтобы мой ответ состоял из тривиального тела ответа HTTP и вложенного файла PDF.

Как это сделать?Взлом на WebOperationContext.Current.OutgoingResponse, похоже, не сработает и не будет правильным, даже если это сработает.Включение битов файла в раздел CDATA или что-то в ответе небезопасно .Должен ли я создать подкласс Message, а затем предоставить пользовательский IDispatchMessageFormatter, который отвечает с ним?Я прошел небольшой путь по этому пути, но в итоге обнаружил, что документация непрозрачна.

Что правильно?

Ответы [ 2 ]

6 голосов
/ 08 июня 2010

Оказывается, что мне нужен WCF-режим "raw", как описано здесь .В общем, я хочу сделать это:

[OperationContract, WebGet(UriTemplate = "/users/{id}/summary?format={format}"]
public Stream GetUserSummary(string id, string format)
{
    if(format == "pdf")
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
        return new MemoryStream(CreatePdfSummaryFileForUser(id));
    }
    else
    {
        // XML or JSON serialization.  I can't figure out a way to not do this explicitly, but my use case involved custom formatters anyway so I don't care.
    }
}
3 голосов
/ 08 июня 2010

Теоретически вы могли бы сделать это с MIME-типом содержимого, состоящим из нескольких частей (см. http://www.faqs.org/rfcs/rfc2387.html).). Однако было бы намного проще вернуть URL в ответе XML / JSON, и клиент может выполнить GET наэту ссылку, чтобы вернуть файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...