Я подписываюсь на веб-службу SSRS SQL Server 2008 (... / reportserver / ReportService2005.asmx? Wsdl), используя WCF, с параметрами конфигурации WCF по умолчанию, насколько я могу судить.
Это делает что-то странное, когда генерирует локальные прокси-классы.
Я буду использовать метод ListChildren в качестве примера:
На стороне клиента WCF генерирует такой интерфейс, как и следовало ожидать:
public interface ReportingService2005Soap {
ListChildrenResponse ListChildren(ListChildrenRequest request);
}
Он также генерирует «клиентский» прокси, который реализует этот интерфейс:
public partial class ReportingService2005SoapClient :
System.ServiceModel.ClientBase<ReportingService2005Soap>, ReportingService2005Soap
{
[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
ListChildrenResponse ReportingService2005Soap.ListChildren(ListChildrenRequest request)
{
return base.Channel.ListChildren(request);
}
public ServerInfoHeader ListChildren(string Item, bool Recursive, out CatalogItem[] CatalogItems) {
ListChildrenRequest inValue = new ListChildrenRequest();
inValue.Item = Item;
inValue.Recursive = Recursive;
ListChildrenResponse retVal = ((ReportingService2005Soap)(this)).ListChildren(inValue);
CatalogItems = retVal.CatalogItems;
return retVal.ServerInfoHeader;
}
}
Как вы можете видеть, клиентский прокси реализует интерфейс, а затем «скрывает» его от использования путем явной реализации интерфейса (так что вам необходимо выполнить приведение к методу интерфейса) и дополнительно с атрибутом EditorBrowsableState.Advanced.
Затем добавляется дополнительный метод-обертка, который использует параметры out.
Есть ли способ прекратить это делать, если просто реализовать интерфейс напрямую?
То, что он здесь делает, ведет вас по пути использования методов-оберток с параметрами «out», и вы обнаружите, что не можете легко смоделировать службу, потому что методы-обертки не являются виртуальными и не определены в любом интерфейсе.
NB. В качестве примера я использую веб-сервис SSRS, но я видел, что WCF делает это и с другими сервисами.