2017-03-27 2 views
0

개체가 Post 요청 본문에서 deserialize되지 않고 DataContractSerializer가 사용 되었기 때문에 this answer이라는 메시지가 나타납니다. WebApi에서 기본적으로, 당신은 당신의 xmlnsDataContractSerializer는 http://schemas.datacontract.org/2004/07/와 만 작동합니까?

<TestModel 
xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace"> 

하고 실제로 작동이 방법을 정의해야합니다,하지만 난 http://schemas.datacontract.org/2005/07/...처럼, 심지어 년 또는 월을 변경하면, 그것은 작동이 중지 내 객체가 다시 널 (null)이된다.

왜 그런가? http://schemas.datacontract.org/2004/07/은 어떻게 든 하드 코드 된 것입니까? 왜이 URL이 맞습니까?

답변

2

모든 데이터 계약 오브젝트는 정규화 된 데이터 계약 이름으로 식별됩니다. Data Contract Names에서 설명하고있는 바와 같이 : 데이터 계약 명명에 관한

기본 규칙은 다음과 같습니다

  • 정규화 된 데이터 계약 이름은 ​​네임 스페이스와 이름으로 구성되어 있습니다.
  • 데이터 멤버에는 이름 만 있지만 네임 스페이스는 없습니다.
  • 데이터 계약을 처리 할 때 WCF 인프라는 네임 스페이스와 데이터 계약 및 데이터 멤버의 이름 모두에 대해 대/소문자를 구분합니다.

데이터 계약 네임 스페이스는 URI (Uniform Resource Identifier) ​​형태를 취합니다. URI는 절대적이거나 상대적 일 수 있습니다. 기본적으로 특정 형식에 대한 데이터 계약에는 해당 형식의 CLR (공용 언어 런타임) 네임 스페이스에서 제공되는 네임 스페이스가 할당됩니다.

기본적으로 Clr.Namespace 형식의 모든 CLR 네임 스페이스는 네임 스페이스 "http://schemas.datacontract.org/2004/07/Clr.Namespace"에 매핑됩니다. 이 기본값을 무시하려면 ContractNamespaceAttribute 특성을 전체 모듈 또는 어셈블리에 적용하십시오. 또는 각 유형에 대한 데이터 계약 네임 스페이스를 제어하려면 속성을 DataContractAttribute으로 설정합니다.

그리고 Data Contract Equivalence

는 : 데이터 계약이 동등하다고

를 들어, 그들은 같은 네임 스페이스와 이름이 있어야합니다. 또한 한쪽에있는 각 데이터 멤버에는 다른쪽에 동일한 데이터 멤버가 있어야합니다.

따라서 데이터 계약 개체를 유선으로 보내려면 정규화 된 데이터 계약 이름이 양 끝에서 일치해야합니다. 위에서 언급 한 바와 같이, 기본 데이터 계약 네임 스페이스는 http://schemas.datacontract.org/2004/07/Clr.Namespace,하지만 당신은 아마 예를 들어, 어떻게 든 조직을 반영하기 위해이를 변경하는 것이 좋습니다 :

[DataContract(Namespace = "http://schemas.MyOrganization.com/v1")] 
public class TestModel 
{ 
    [DataMember] 
    public string Value { get; set; } 
} 

아니면 전체 조립 및 닷넷 네임 스페이스를 설정할 수 있습니다 :

[assembly: ContractNamespace("http://schemas.MyOrganization.com/v1", ClrNamespace = "YourMvcApp.YourNameSpace")] 

데이터 계약 직렬화 JSON과 XML을 모두 사용할 수 있습니다, 그래서 어떻게 어떻게 DataContractSerializer은에서와 XML로 데이터 계약 이름을지도 않습니다합니까?너무 URI XML 요소 로컬 이름과 네임 스페이스를 사용 않습니다

<TestModel xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace"> 

xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace" 속성은 로컬 이름 TestModel를 가진 요소의 default XML namespace declaration입니다. 로컬 이름 공간과 함께 소자의 expanded name 포함한다. XML 요소 이름은 네임 스페이스 URI 및 로컬 이름 일치, 그래서 마이크로 소프트는 XML 요소 로컬 이름에 데이터 계약 이름을 일치하도록 선택한 경우 동일한 것으로 간주, 심지어 을 변경하는 이유는 XML 네임 스페이스 URI에 데이터 계약 네임 스페이스된다 URI를 연도 또는 월이 실패 할 직렬화됩니다.

따라서 네임 스페이스를 변경하려면 클라이언트 측에서 네임 스페이스를 업데이트해야하므로 데이터 계약 웹 API 또는 WCF 서비스를 원격 설치하기 전에 네임 스페이스를 선택해야합니다. (예, here 또는 here에 대한 설명으로 물론, WCF를 들어, 클라이언트는 일반적으로 스키마 메타 데이터에서 클라이언트를 자동으로 생성됩니다.)

관련 문제