12

すばらしいライブラリであるServiceStackを使い始めたところです。

ただし、xmlとjsonを返す必要があるというビジネス要件があります。xmlは特定の形式である必要があります。

たとえば、次の形式のxmlを期待する既存の顧客がいます。

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

つまり、基本的には一連の属性です。

ServiceStackはDTOの概念を使用し、上記のxml属性の形式ではなくxml要素を返すDataContractSerializerを使用していることを知っています。

リクエストにDTOを使用したいので(Acceptヘッダーでapplication/xmlまたはapplication/jsonを渡す)、独自の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)に問題はありますか?

私がこのアプローチを使用する場合、それはビジネス要件を解決します。

編集

httpResultを次のように返すことができることがわかりました:

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

これにより、正しいコンテンツタイプが得られます。

それで、これは正しい方法ですか、それともこのルートをたどると問題が発生しますか?

4

1 に答える 1

17

はい、IHttpResult を返すと、正確なペイロード、Content-Type、およびその他の HTTP ヘッダーを必要に応じて制御できます。

また、ストリームを返すことに限定されません。つまり、HttpResult を使用して、別の Content-Type を持つ xml 文字列を返すことができます。

ServiceStack の戻り値の型で何ができるかをよりよく示すリンクを次に示します。

FileInfo オブジェクトを使用して静的ファイルを返すこともできます。オプションのパラメーターを使用すると、ファイルを添付ファイルとして返すことができます。これにより、ユーザーはブラウザーでファイルを表示しようとするのではなく、ファイルをダウンロードするように求められます。

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true);
于 2012-04-06T18:10:21.710 に答える