我有一个现有的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增强功能(扩展方法)使用了不同的类;但我现在有点无知为什么一个人能够反序列化而另一个人不会。
干杯。
答案 0 :(得分:2)
WCF Web API不使用DataContact序列化程序,而是使用XmlSerializer,因此您需要使用这些序列化程序来装饰您的Contract类。尝试将带有命名空间的XmlRootAttribute添加到Contract类。
[XmlRoot(Namespace = "http://myservice/schema")]
public class Contact
{
// ...
}