5

IHasResponseStatus問題は、プロパティを使用するときに応答に 1 つの名前空間を使用しpublic ResponseStatus ResponseStatus { get; set; }、接頭辞 d2p1 を削除する方法ResponseStatusです。

http://schemas.tagway.com.ua/typesすべての Web サービス モデルに対して単一の名前空間を使用します。ServiceStack は ResponseStatus に独自の名前空間を自動的に追加するため、ResponseStatus ノードを除いて応答は良好に見えますxmlns:d2p1="http://schemas.servicestack.net/types"

サービス モデル:

namespace NTPCore.ServiceModel.Operations.Balance
{
    public class Balance
    {
        public Auth auth { get; set; }    
    }

    public class BalanceResponse : IHasResponseStatus
    {
        public ResponseStatus ResponseStatus { get; set; }
        public int balance { get; set; }
        public int limit { get; set; }
    }
}

プロジェクト NTPCore.ServiceModel の AssemblyInfo.cs:

[assembly: ContractNamespace("http://schemas.tagway.com.ua/types",    ClrNamespace = "NTPCore.ServiceModel.Operations.Balance")]
[assembly: ContractNamespace("http://schemas.tagway.com.ua/types",    ClrNamespace = "ServiceStack.ServiceInterface.ServiceModel")]             //may be this not need...experimenting, nothing happance for me

応答例:

<BalanceResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.tagway.com.ua/types">
  <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
    <d2p1:ErrorCode>String</d2p1:ErrorCode>
    <d2p1:Errors>
      <d2p1:ResponseError>
        <d2p1:ErrorCode>String</d2p1:ErrorCode>
        <d2p1:FieldName>String</d2p1:FieldName>
        <d2p1:Message>String</d2p1:Message>
      </d2p1:ResponseError>
    </d2p1:Errors>
    <d2p1:Message>String</d2p1:Message>
    <d2p1:StackTrace>String</d2p1:StackTrace>
  </ResponseStatus>
  <balance>0</balance>
  <limit>0</limit>
</BalanceResponse>
4

2 に答える 2

2

ServiceStackは、XML シリアル化に .NET の組み込み XML DataContractSerializer を利用します。残念ながら、 が効果を持つためには、DTO をおよび属性[assembly: ContractNamespace ..]で装飾する必要があります。例えば:[DataContract][DataMember]

[DataContract]
public class Balance
{
    [DataMember]
    public Auth auth { get; set; }    
}

[DataContract]
public class BalanceResponse : IHasResponseStatus
{
    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }

    [DataMember]
    public int balance { get; set; }

    [DataMember]
    public int limit { get; set; }
}

それは醜いですが、それはきれいな XML の代償です。もう 1 つのオプションは、組み込みの XML Content-Typeを独自のカスタムのシリアライゼーション/デシリアライゼーション ルーチンでオーバーライドすることですが、それにはさらに多くの作業が必要です。

于 2012-11-27T21:39:05.537 に答える