外部サービスから動的なjsonデータのセットを組み合わせて返すサービスを構築しました。データをjsonとして返すことは問題ありませんが、XML ...
DTOの文字列プロパティで(JsonConvert.DeserializeXNodeを使用して)生のXMLとして返そうとしましたが、最終的なServiceStack応答で、文字列内のxml文字がエスケープされます。
データを動的/オブジェクトとして返そうとしましたが、jsonは問題ありませんが、XMLは多くのDataContractSerializerランタイムエラーをスローします。
これは、おそらく単純なことで、私を壁に押し上げています。同じサービス/操作(Acceptヘッダーに応じて)によって動的データがjsonとxmlの両方として返される例を誰かが投稿できますか?
みんなありがとう。
ServiceStackは、デフォルトで.NETのXMLDataContractSerializerを使用してDTOをシリアル化します。それが不適切な場合は、独自のXMLコンテンツタイプシリアライザーを登録してXMLシリアル化を引き継ぐことができます。これには、ServiceStackのデフォルトのDataContractSerializerを置き換えて.NETのXmlSerializerを使用する例が含まれています。
DTOの文字列プロパティで(JsonConvert.DeserializeXNodeを使用して)生のXMLとして返そうとしましたが、最終的なServiceStack応答で、文字列内のxml文字がエスケープされます。
これは正しくありません。ServiceStackでは、応答に直接書き込む生のXMLなど、多数の生のデータ型を返すことができます。string
応答OutputStream
に書き込んだ後に何か他のものがエスケープされる可能性があります(Webサーバーやクライアントなど)が、 ServiceStackではありません。
XMLシリアル化を制御する別の戦略は、DataContract
またはXmlSerializer
属性で注釈が付けられたDTOにそれらをコピーすることです。これにより、XMLのシリアル化方法を制御できますが、動的データでは面倒です。XMLは、.NETの汎用のシリアル化としては一般的に不適切な選択です。データコレクションは醜いXMLを生成します。
この1つのサービスのXMLのみを処理する必要がある場合は、デフォルトのXMLシリアライザー実装をオーバーライドする代わりに、ServiceStackのコンテンツタイプ固有の実装を使用してXML要求を異なる方法で処理できます。
public class MyServices : Service
{
// Handles all other unspecified Verbs/Formats
public object Any(MyRequest request) => ...;
// Handles any XML Requests
public object AnyXml(MyRequest request)
{
var dto = Any(request);
string xml = CustomXmlSerializer(dto);
return xml;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加