Добавление ссылки на службу WCF возвращается к XmlSerializer

Мы потребляем сервис ASMX, добавляя WCF "Service Reference" в наш проект. Когда мы делаем это, по умолчанию предполагается использовать DataContractSerializer и если что-то пойдет не так, это откатится к XmlSerializer,

Я пытался заставить DataContractSerializer когда генерируются прокси-классы, но когда я это делаю, они неполные и пропускают все пользовательские классы, используемые веб-сервисом (оставляя только интерфейс для Soap, SoapChannel и класса SoapClient).

Ну, что-то идет не так, и он возвращается к использованию XmlSerializer, Я не вижу никаких ошибок или предупреждений, когда я генерирую ссылку.

Как я могу узнать, что вызывает DataContractSerializer потерпеть неудачу и отступить к XmlSerializer?

1 ответ

Решение

Короче говоря, мы не смогли заставить VS использовать DataContractSerializer. Вместо этого мы в итоге написали наши собственные сервисные контракты WCF, которые представляли веб-сервис. Когда мы используем сервис, мы вместо этого создаем ChannelFactory в общем, используя наши СОБСТВЕННЫЕ контракты на обслуживание. Ниже приведен код, который мы использовали для создания канала.

 /// <summary>
 /// A generic webservice client that uses BasicHttpBinding
 /// </summary>
 /// <remarks>Adopted from: http://blog.bodurov.com/Create-a-WCF-Client-for-ASMX-Web-Service-Without-Using-Web-Proxy/
 /// </remarks>
 /// <typeparam name="T"></typeparam>
 public class WebServiceClient<T> : IDisposable
 {
     private readonly T channel;
     private readonly IClientChannel clientChannel;

     /// <summary>
     /// Use action to change some of the connection properties before creating the channel
     /// </summary>
     public WebServiceClient(string endpointUrl, string bindingConfigurationName)
     {
         BasicHttpBinding binding = new BasicHttpBinding(bindingConfigurationName);

         EndpointAddress address = new EndpointAddress(endpointUrl);
         ChannelFactory<T> factory = new ChannelFactory<T>(binding, address);

         this.clientChannel = (IClientChannel)factory.CreateChannel();
         this.channel = (T)this.clientChannel;
     }

     /// <summary>
     /// Use this property to call service methods
     /// </summary>
     public T Channel
     {
         get { return this.channel; }
     }

     /// <summary>
     /// Use this porperty when working with Session or Cookies
     /// </summary>
     public IClientChannel ClientChannel
     {
         get { return this.clientChannel; }
     }

     public void Dispose()
     {
         this.clientChannel.Dispose();
     }
 }
Другие вопросы по тегам