Добавление ссылки на службу 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();
}
}