更改路径注册后无法将合同反序列化

时间:2012-02-02 17:31:34

标签: asp.net wcf serialization wcf-web-api

我有一个现有的WCF Web API应用程序,它使用以下模式注册路由:

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

我最近更新了预览6.我还更新了Global.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; }
}

我得到的问题是,当我发布以前可接受的合同时,例如:

<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'预期的a   值可分配给输入参数'contact'的类型'Contact'但是   收到'HttpRequestMessage`1'类型的值。'。请参阅服务器日志   更多细节。

我发现如果从请求中删除 xmlns =“http:// myservice / schema” ,该服务会接受该请求。我现有的api客户端将使用此礼物调用新服务,因此我必须确保接受这些消息。

据我所知,我使用的WCF Web Api增强功能(扩展方法)使用了不同的类;但我现在有点无知为什么一个人能够反序列化而另一个人不会。

干杯。

1 个答案:

答案 0 :(得分:2)

WCF Web API不使用DataContact序列化程序,而是使用XmlSerializer,因此您需要使用这些序列化程序来装饰您的Contract类。尝试将带有命名空间的XmlRootAttribute添加到Contract类。

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