2012-11-27 2 views
4

질문은 IHasResponseStatuspublic ResponseStatus ResponseStatus { get; set; } 속성을 사용할 때 하나의 네임 스페이스를 사용하여 ResponseStatus에 접두사 d2p1을 제거하는 방법입니다.ResponseStatus xmlns d2p1

모든 웹 서비스 모델에 단일 네임 스페이스 http://schemas.tagway.com.ua/types을 사용합니다. ResponseStatus 노드를 제외하고 응답은 ServiceStack : ResponseStatus에 대해 자체 네임 스페이스 xmlns:d2p1="http://schemas.servicestack.net/types"을 자동으로 추가하기 때문에 노드를 제외하고는 훌륭하게 보입니다.

서비스 모델 : 프로젝트 NTPCore.ServiceModel에서

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; } 
    } 
} 

의 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> 

답변

2

ServiceStack는 .NET의 내장을 사용한다 for XML DataContractSerializer에 대한 그것의 XML 직렬화. 불행히도 [assembly: ContractNamespace ..]에 효과가 있으려면 [DataContract][DataMember] 속성으로 DTO를 꾸밀 필요가 있습니다. 예컨대 : 그것은 추한,하지만 꽤 XML을 지불하는 가격입니다

[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; } 
} 

, 다른 옵션은 사용자 정의 직렬화/역 직렬화 루틴 override the built-in XML Content-Type이다 - 그러나 그것은 더 많은 작업이 필요합니다.

+0

빠른 응답을 보내 주셔서 감사합니다! 그러나 [DataContract] 및 [DataMember] 상황을 추가 한 후에는 상황이 동일합니다. 나는 이것을 시도한다 : [DataContract (Namespace = "http://schemas.tagway.com.ua/types")]하지만 여전히 아무것도 바뀌지 않는다 ... – Inprimex

+0

정적 인 ServiceStack의 ResponseStatus 네임 스페이스는 변경할 수 없다. 예쁜 XML을 원하면'http : // schemas.servicestack.net/types' 네임 스페이스를 사용해야합니다. – mythz

+0

mmm이지만 IService를 사용하고 전역 오류 처리를 구현하여 예쁜 XML에 대한 계획을 구현할 수 있습니까? – Inprimex

0
[CollectionDataContract(Name = "root", ItemName = "row")] 
+0

이 코드 스 니펫을 이용해 주셔서 감사 드리며 일부 제한적이며 즉각적인 도움이 될 것입니다. A [해당 설명] (https://meta.stackexchange.com/q/114762/349538)이 문제의 좋은 해결책 인 이유를 보여줌으로써 의 장기적인 가치를 크게 향상시키고 을 유용하게 사용할 수 있습니다. 다른 유사한 질문을 가진 미래의 독자들에게. 대답을 [편집]하십시오. 가정을 포함하여 몇 가지 설명을 추가하십시오. –