2

現在、ServiceStack を使用して API を実装していますが、問題が発生しました。提供された API 仕様は、API に送信される XML パケットを定義します。この仕様は変更できず、自分で制御することはできません。

問題は、ルート要素に次のような項目のリストがあることです。

<data>
    <id>0</id>
    <locationID>10</locationID>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
    <cust>
       <id>0</id>
    </cust>
</data>

私は仕様を実装し、ほぼ正しいものにしましたが、親ノードを囲むことなく XML で要素を繰り返す方法がわかりません。

これはServiceStackを使用しているため、データ契約を使用しており、要素をCollectionDataContractとして設定しようとしましたが、要素を親ノードにラップします。

親要素が使用されていないことを指定できるかどうか、または親のないノードを含むノードにプレーンなリストを実装できるかどうか疑問に思っていました。

何か案は?

4

1 に答える 1

1

これは、ServiceStack で使用される .NET の DataContract Xml Serializer では不可能です。これをサポートする XmlSerializer が見つかった場合は、代わりにそれを使用するために登録できます。

appHost.ContentTypeFilters.Register(ContentType.Xml, SerializeToStream, DeserializeFromStream);

または、 http ://www.servicestack.net/ServiceStack.Northwind/vcard-format.htm に示されているように、カスタム contentType を登録します 。

個人的には、この場合、シリアル化された xml 文字列を返すだけです。これは次のいずれかで実行できます。

  • Service の本体で文字列を返すだけです (特定の ContentType を強制するために HttpResult でラップすることもできます)。サービスで XML 文字列を返すと、すべてのエンドポイントに対して常に XML が返されます。

  • ServiceBase で OnAfterExecute をオーバーライドし、厳密に型指定された応答 DTO を XML ContentType 要求の XML 文字列に変換します。

  • カスタム応答フィルター(またはFilter Attribute )の登録

例えば:

appHost.ResponseFilters.Add((req, res, dto) =>
{
    if (req.ResponseContentType == ContentType.Xml)
    {
        var sb = new StringBuilder();
        DataDto dataDto = (DataDto)dto;
        sb.AppendLine("<data>");
        sb.AppendFormat("<id>{0}</id>",dataDto.Id);
        //... etc
        res.ContentType = ContentType.Xml;
        using (var sw = new StreamWriter(res.OutputStream)) {
          sw.WriteLine(sb.ToString());
        }
        res.Close();
    }
});
于 2012-06-19T18:29:09.490 に答える