ServiceStack и возврат потока - программирование

ServiceStack и возврат потока

Я только начал использовать ServiceStack, который является удивительной библиотекой.

Однако у меня есть бизнес-требование, где мы должны возвращать xml и json, где xml должен быть в определенном формате.

Например, у нас есть существующие клиенты, которые ожидают xml формата:

<service name="service1" type="audio" .../>

так что в основном куча атрибутов.

Я знаю, что ServiceStack использует концепции DTO и использует DataContractSerializer, который возвращает xml-элементы, а не в форме выше с атрибутами xml.

Я все еще хочу использовать DTO для запросов (передача в приложении /xml или application/json в заголовке Accept), и затем я могу создать свои собственные строки xml или json-строки, а затем вернуть их как:

string result = "....xml or json string...";
return new MemoryStream(Encoding.UTF8.GetBytes(result));

где строка результата может быть строкой xml или json-строкой.

Я заметил в скрипаче ответ Content-Type как text/html.

С помощью подхода, который я использую, я нарушаю любые принципы REST? Будут ли проблемы с Content-Type, как в настоящее время (text/html)?

Если я использую этот подход, он решает бизнес-требования.

Edit

Я обнаружил, что могу вернуть httpResult как:

return new HttpResult(
         new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml");

который дает правильный тип содержимого.

Итак, это правильный путь или у меня возникнут проблемы, если я поеду по этому маршруту?

4b9b3361

Ответ 1

Да, возврат IHttpResult позволит вам контролировать точную полезную нагрузку, Content-Type и другие HTTP-заголовки, как вы пожелаете.

Также вы не ограничены возвратом потока, т.е. вы можете использовать HttpResult для возврата строки xml с другим типом контента.

Вот несколько ссылок, которые лучше показывают, что возможно с возвращаемыми типами ServiceStack:

Вы также можете вернуть статический файл с помощью объекта FileInfo с необязательным параметром, чтобы вернуть файл в виде вложения, которое предложит пользователю загрузить файл, а не попытаться просмотреть его в браузере, используя:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true);