WCF, svcutil.exe: как правильно сопоставить или настроить клиентский код веб-службы? - PullRequest
2 голосов
/ 16 августа 2011

Это о том, как заставить сумасшедшего автоматически созданного клиента WCF работать.Легко воспроизводить, все элементы здесь, просто для копирования и вставки, нужна только командная строка.

В cmd.exe:

: set up environment
"%VS100COMNTOOLS%"\vsvars32.bat
: create test directory
md wsc
cd wsc
set url=http://xsc-demo.xlogics.eu/DEMO/XTraceWCF/XTrace.svc?wsdl
svcutil /language:cs /config:app.config %url%
notepad app.config
: change client/endpoint/@name to "Gurke" (or whatever)
copy ..\Test.cs .
csc /appconfig:app.config XTrace.cs Test.cs

Где Test.cs:

class Test {
    static void Main() {
        XTraceClient client;
        // client = new XTraceClient();
        client = new XTraceClient( "Gurke" ); // match app.config
        client.Close();
    }
}

Оставляет вам следующие файлы:

  1.501 app.config
    193 Test.cs
 31.744 Test.exe
 69.284 XTrace.cs

И (я думаю) соответствующий раздел из сгенерированного кода клиента:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://xlogics.eu/xtrace", ConfigurationName="IXTrace")]
public interface IXTrace

Как вы можете видеть, он имеет ConfigurationName="IXTrace" и public interface IXTrace.

Выполнение Test.exe приводит к следующему исключению:

System.InvalidOperationException:
Could not find endpoint element with name 'Gurke'
and contract 'IXTrace'in the ServiceModel client
configuration section. This might be because no
configuration file was found for your application,
or because no endpoint element matching this name
could be found in the client element.

Однако мой app.config, кажется, совпадает (несущественные части опущеныдля удобства чтения:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="XTrace" ... >
                    <readerQuotas ... />
                    <security mode="None">
                        <transport ... />
                        <message ... />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint
              address="http://xsc-demo.xlogics.eu/DEMO/XTraceWCF/XTrace.svc"
              binding="basicHttpBinding"
              bindingConfiguration="XTrace"
              contract="IXTrace"
              name="Gurke" />
        </client>
    </system.serviceModel>
</configuration>

Как видите, @contract равно IXTrace, а @name равно Gurke.Так откуда же несоответствие?

Изменение ConfigurationName="IXTrace" на ConfigurationName="Gurke" и перекомпиляция не решает проблему: та же ошибка.

Так много для этой конкретной проблемы.Более сложный вопрос состоит в том, чтобы понять, как кусочки и кусочки должны играть вместе, чтобы вы могли перестать работать в режиме с практическими рекомендациями и биться головой о стену проблем с настройкой (которые нередки, если Google является каким-либо индикатором).Указатели приветствуются.

Обновление

В app.config:

<endpoint name="Heinz" contract="moin.moin.IXTrace" ...

В XTrace.cs:

namespace moin.moin {

[System.CodeDom.Compiler.GeneratedCodeAttribute(
   "System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(
   Namespace="http://xlogics.eu/xtrace",
   ConfigurationName="moin.moin.IXTrace")]
public interface IXTrace { ...

И тестовая программа:

using moin.moin;

class Test {
    static void Main() {
        XTraceClient client = new XTraceClient( "Heinz" );
        client.Close();
    }
}

Почему не работает?

Обновление 2

Решение в комментариях к ответу Sixto.Это не сработало, потому что конфиг-файл конфигурации имел неправильное имя и с ним не обращались.На самом деле, мне не нужно это для компиляции, простой csc Test.cs XTrace.cs был бы достаточно хорош.Конфигурационный файл просто должен соответствовать имени EXE, поэтому с Test.exe это должно было быть Test.exe.config.

1 Ответ

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

Убедитесь, что атрибут контракта (в элементе system.serviceModel / client / endpoint) содержит полностью определенное пространство имен интерфейса IXTrace.Найдите в файле XTrace.cs объявление пространства имен C #.Атрибут контракта должен содержать «YourService.IXTrace», если интерфейс объявлен как в следующем коде:

namespace YourService
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(
        Namespace="http://xlogics.eu/xtrace",
        ConfigurationName="IXTrace")]
    public interface IXTrace
    {
    //Rest of generated code
    }
}
...