如何使用Reflection和app.config调用wcf
本文关键字:config 调用 wcf app 何使用 Reflection | 更新日期: 2023-09-27 18:01:45
我在vs2010中创建了一个类库项目[MyLibrary],并添加了Service Reference[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方法。它产生错误:找不到引用合约"MyService"的默认端点元素。在ServiceModel客户端配置部分中的IMyService'。这可能是因为没有找到您的应用程序的配置文件,或者是因为在客户端元素中没有找到与此契约匹配的端点元素。
我认为它没有在运行时使用反射读取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。似乎无用的反射。谢谢!
您应该将<system.servicemodel>
节从MyLibrary.dll.config复制到应用程序引用MyLibrary.dll的app.config中。这应该足够了。无论如何,你问如何加载app.config。在这篇文章中描述了如何从任何文件加载WCF客户端配置。但是,它应该足以复制servicemodel部分。
这与通过反射调用无关。错误提示无法找到Mylibrary.dll.config
中的配置。如果你调用客户端代码直接引用Mylibrary.dll,而没有将配置添加到新程序的app.config(或web.config)中,你会得到同样的错误。
MyService.MyServiceClient client = new MyServiceClient();
默认情况下,上述代码将在当前运行的进程的配置文件中查找<system.servicemodel>
。新程序的配置需要将Mylibrary.dll.config文件中的信息添加到它的配置文件中。否则,必须直接在代码中配置客户端。