Невозможно десериализовать контракт после изменения регистрации маршрута - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть приложение WCF Web API, которое регистрирует маршруты по следующему шаблону:

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

Я недавно обновил до Preview 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 »ожидала значение, присваиваемое типу« Контакт »для входного параметра« контакт », но получило значение типа« HttpRequestMessage`1 ».».См. Подробности в журналах сервера.

Я обнаружил, что если я удаляю xmlns = "http://myservice/schema" из моего запроса, служба принимает запрос. У меня есть существующие клиенты APIкоторый будет делать вызовы новой службе с этим подарком, поэтому я должен убедиться, что эти сообщения приняты.

Я понимаю, что используемые мной WCF-расширения WebFi (метод расширения) используют разные классы подкапот, но сейчас я немного не знаю, почему один сможет десериализовать, а другой - нет.

Приветствия.

1 Ответ

2 голосов
/ 03 февраля 2012

Веб-API WCF использует не сериализатор DataContact, а XmlSerializer , поэтому вам необходимо использовать атрибуты, приписываемые для украшения вашего класса Contract. Попробуйте добавить XmlRootAttribute с пространством имен в класс Contract.

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