Как вызвать wcf с помощью Reflection и app.config?

Я создаю проект библиотеки классов [MyLibrary] в vs2010 и добавляю ссылку на службу [http://127.0.0.1/MyService.svc]. Таким образом, он включает такой узел в app.config.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMyService" 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>
    </bindings>
    <client>
        <endpoint address="http://127.0.0.1/MyService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService"
            contract="MyService.IMyService" name="BasicHttpBinding_IMyService" />
    </client>
</system.serviceModel>

Я компилирую проект MyLibrary, он генерирует MyLibrary.dll и MyLibrary.dll.config. Обычно , я могу вызвать метод wcf, например:

MyService.MyServiceClient client = new MyServiceClient(); 

int result = client.Add (3,6);

Я не использую app.config через программу. Он работает хорошо.

Теперь я пишу другую программу для загрузки MyLibrary.dll и вызова метода wcf с помощью refelection.it генерирует ошибку: не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт MyService.IMyService в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или потому, что в клиентском элементе не может быть найден элемент конечной точки, соответствующий этому контракту.

Я думаю, что он не читал конфигурацию в app.config с использованием отражения во время выполнения. Я пытаюсь использовать такой метод, он все равно не работает.

string assemblyPath = Assembly.GetExecutingAssembly().Location;
string configPath = assemblyPath + ".config";
currentDomain.SetData("APP_CONFIG_FILE", configPath);
typeof(ConfigurationManager)
    .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, 0);

typeof(ConfigurationManager)
    .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, null);

typeof(ConfigurationManager)
    .Assembly.GetTypes()
    .Where(x => x.FullName == "System.Configuration.ClientConfigPaths").First()
    .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, null);

Что мне делать, если я не хочу менять вызывающий код wcf, указанный выше? Как разрешить программе загружать и распознавать app.config с помощью отражения во время выполнения. Кажется бесполезным размышлением как. Спасибо!


person gmplayer    schedule 01.03.2013    source источник
comment
Что в вашей новой программе находится в вашем app.config?   -  person Davin Tryon    schedule 01.03.2013
comment
Ничего, MyLibrary refenrence wcf, поэтому конфигурация клиента wcf существует в Mylibrary.dll.config. Во время выполнения, при вызове метода wcf, как автоматически найти конфигурацию wcf в Mylibrary.dll.config。 Я все еще использую такой код: MyService.MyServiceClient client = новый MyServiceClient ();   -  person gmplayer    schedule 01.03.2013
comment
если я не изменил способ вызова, такая ошибка: не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт MyService.IMyService в разделе конфигурации клиента ServiceModel. поэтому я думаю, что он не может получить конфигурацию wcf в Mylibrary. dll.config с использованием отражения.   -  person gmplayer    schedule 01.03.2013
comment
при использовании отражения, как инициализировать и загрузить Mylibrary.dll.config。 более того , при вызове метода wcf он автоматически находит конфигурацию wcf в Mylibrary.dll.config если не использовать отражение, почему он знает app.config и использует конфигурация wcf?   -  person gmplayer    schedule 01.03.2013
comment
Это не имеет ничего общего с вызовом через отражение. Это сообщение об ошибке указывает, что конфигурация в Mylibrary.dll.config не может быть найдена.   -  person Davin Tryon    schedule 01.03.2013


Ответы (2)


Вы должны скопировать <system.servicemodel> раздел из MyLibrary.dll.config в app.config ссылки вашего приложения на MyLibrary.dll. Этого должно хватить. В любом случае вы спрашиваете, как загрузить app.config. В этом сообщение описало, как загрузить конфигурацию клиента WCF из любого файла. Но опять же, достаточно скопировать раздел servicemodel.

person paramosh    schedule 01.03.2013
comment
Спасибо, я не могу скопировать раздел ‹system.servicemodel› из MyLibrary.dll.config в app.config. Я не могу работать с app.config, MyLibrary.dll вызывается Quarz.net. - person gmplayer; 01.03.2013

Это не имеет ничего общего с вызовом через отражение. Это сообщение об ошибке указывает, что конфигурация в Mylibrary.dll.config не может быть найдена. Вы получите ту же ошибку, если бы вызывали клиентский код, напрямую ссылающийся на Mylibrary.dll, без добавления конфигурации в app.config (или web.config) новой программы.

MyService.MyServiceClient client = new MyServiceClient(); 

По умолчанию приведенный выше код будет искать в файле конфигурации текущего запущенного процесса <system.servicemodel>. Конфигурация вашей новой программы требует, чтобы информация из файла Mylibrary.dll.config была добавлена ​​в файл конфигурации. В противном случае вы должны настроить клиента напрямую в коде.

person Davin Tryon    schedule 01.03.2013