Почему WCF генерирует методы интерфейса контракта обертки прокси с новыми методами с разными сигнатурами? - PullRequest
6 голосов
/ 26 августа 2011

Я подписываюсь на веб-службу 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 делает это и с другими сервисами.

1 Ответ

7 голосов
/ 26 августа 2011

Это, вероятно, происходит, если ваша служба использует MessageContract s.По умолчанию прокси-сервер пытается развернуть эти контракты сообщений, чтобы открытые операции принимали их содержимое напрямую.Если вы также хотите использовать контракты сообщений на клиенте, вам необходимо настроить его в дополнительных настройках Добавить сервисную ссылку , отметив Всегда генерировать контракты сообщений .

...