Svcutil генерирует неверный конфиг с несколькими конечными точками - PullRequest
3 голосов
/ 19 апреля 2010

У меня есть служба WCF, которая выставила мыло и конечную точку xml. Когда я использую svcutil для генерации прокси-кода на стороне клиента, сгенерированная конфигурация содержит две конечные точки, что приводит к сбою клиента. Если я редактирую файл web.config и удаляю вторую конечную точку (с пользовательской привязкой), все работает как положено. Есть ли способ заставить svcutil сгенерировать конфигурацию, которая просто работает, так что мне не нужно каждый раз редактировать файл вручную?

Ошибка на стороне клиента:

Не удалось загрузить раздел конфигурации конечной точки для контракта «MyNamespace.ITestService», поскольку найдено более одной конфигурации конечной точки для этого контракта. Пожалуйста, укажите предпочитаемый раздел конфигурации конечной точки по имени.

Команда Svcutil:

svcutil http://api.local/Test.svc
    /reference:bin\MyNamespace.Interface.dll 
    /config:web.config 
    /mergeConfig 
    /out:"Service References\TestService.cs" 
    /n:*,MyNamespace

Сгенерированный клиентский конфиг:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_ITestService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_ITestService">
                <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                    messageVersion="Soap12" writeEncoding="utf-8">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                </textMessageEncoding>
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://api2.local/Test.svc/soap" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ITestService" contract="MyNamespace.ITestService"
            name="BasicHttpBinding_ITestService" />
        <endpoint binding="customBinding" bindingConfiguration="CustomBinding_ITestService"
            contract="MyNamespace.ITestService" name="CustomBinding_ITestService" />
    </client>
</system.serviceModel>

1 Ответ

0 голосов
/ 16 августа 2011

Вам нужно будет указать имя конфигурации конечной точки. Обойти это невозможно, поскольку они используют один и тот же контракт. Вот почему System.ServiceModel.ClientBase имеет этот аргумент конструктора.

var client = new TestClient("CustomBinding_ITestService");
...