2012-02-02 2 views
2

을 변경 한 후 계약을 역 직렬화 할 수 없습니다 나는이 다음과 같은 패턴을 사용하여 경로를 등록하는 기존 WCF 웹 API 응용 프로그램 :경로 등록

RouteTable.Routes.Add(new ServiceRoute("MyService", new WebServiceHostFactory(), typeof(MyServiceImplementation))); 

내가 최근에 업데이트 나는 또한 세계에서 등록 패턴을 업데이트 미리보기 (6)에을 .asax는 향상된 기능 확장을 사용합니다.

routes.SetDefaultHttpConfiguration(new MyServiceConfiguration()); 
routes.MapServiceRoute<MyServiceImplementation>("MyService"); 

또한 요청시 메소드에 게시 할 계약이 있습니다.

[WebInvoke(UriTemplate = "/MyOperation", Method = "POST")] 
Contact MyOperation(Contact contact); 

...

[DataContract(Name = "Contact")] 
public class Contact : IExtensibleDataObject 
{ 
    [StringLength(50)] 
    [StringNotEmpty] 
    [DataMember(Name = "FirstName", Order = 1)] 
    public string FirstName { get; set; } 

    [DataMember(Name = "LastName", Order = 1)] 
    public string LastName { get; set; } 

    //[StringLength(50)] 
    //[DataMember(Name = "Location", Order = 1)] 
    //public String Location { get; set; } 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

내가 무엇입니까 문제는 그 I는 다음과 같은 이전에 허용 계약을 게시 할 때 :

<Contact xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://myservice/schema"> 
    <FirstName>John</FirstName> 
    <LastName>Smith</LastName> 
    <Location i:nil="true" /> 
</Contact> 

나는 다음과 같은 예외가 :

서버가 요청을 처리하는 동안 오류가 발생했습니다. 서비스에 유효한 요청을 구성하기위한 서비스 도움말 페이지를 참조하십시오. 예외 메시지는 '서비스 동작'MyOperation 접촉 '입력 파라미터'연락 '그러나 타입의 값이 수신 된'HttpRequestMessage`1 '입력 귀속되는 값을 예상'입니다. '. 에 대한 자세한 내용은 서버 로그를 참조하십시오. 내 요청에서, 서비스가 요청을 수락 :

나는 내가 의 xmlns = "// MYSERVICE/스키마 HTTP"를 제거하면 것을 발견했다. 나는 현재의 새로운 서비스에 대한 호출을 할 기존의 API 클라이언트를 가지고 있으므로 이러한 메시지가 받아 들여지는지 확인해야한다.

가 이해 그 WCF 웹 API 광고 향상 (확장 메서드) 나는 후드를 사용하는 서로 다른 클래스를 사용하고 있습니다; 그러나 나는 왜 사람들이 비 직렬화 할 수 있고 다른 하나는 그렇지 않을지에 관해서는 조금 무지하다.

건배.

답변

2

WCF 웹 API는 DataContact serializer를 사용하지만 XmlSerializer을 사용하므로 계약 클래스를 꾸미기 위해 사용 된 속성을 사용해야합니다. 네임 스페이스가있는 XmlRootAttribute를 Contract 클래스에 추가해보십시오.

[XmlRoot(Namespace = "http://myservice/schema")] 
public class Contact 
{ 
    // ... 
} 
+0

그것을 않았다! 그래서, 난 당신이 [DataContractFormat] 그걸 얻기 위해 속성과의 계약에 태그를 수있는 (http://codebetter.com/glennblock/2011/05/15/using-datacontracts-with-wcf-web-api/) 읽었다 DataContractSerializer를 사용합니다. 그게 왜 효과가 없을지 모르는 어떤 생각? –

+0

그들은 버전간에 많은 제동 변경 사항을 만들어 왔습니다. DataContractSerializer에 초점을 맞춘 요소를 사용하면 실제로 REST 서비스에는 적합하지 않습니다. 그들은 여전히 ​​JSONDataContractSerializer를 사용합니다. – Maurice