Добавление ссылки на службу WCF возвращается к XmlSerializer - PullRequest
0 голосов
/ 04 октября 2011

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

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

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

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

1 Ответ

0 голосов
/ 06 января 2012

Короче говоря, мы не смогли заставить 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();
     }
 }
...