Я создаю проект библиотеки классов [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 с помощью отражения во время выполнения. Кажется бесполезным размышлением как. Спасибо!