如何使用Reflection和app.config调用wcf?

时间:2013-03-01 08:17:33

标签: c# wcf reflection app-config

我在vs2010中创建了一个类库项目[MyLibrary]并添加了服务引用[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);

我还没有通过programe.it运行app.config。

现在,我编写另一个程序来加载MyLibrary.dll并使用refelection.it生成错误调用wcf方法: 找不到引用合同&#39; MyService.IMyService&#39;的默认端点元素。在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代码,我该怎么办?如何让programe在运行时使用反射加载和识别app.config。似乎无用的反思。谢谢!

2 个答案:

答案 0 :(得分:0)

您应该将<system.servicemodel>部分从MyLibrary.dll.config复制到应用程序引用MyLibrary.dll的app.config。这应该够了。无论如何,你问的是如何加载app.config。在此post中描述了如何从任何文件加载WCF客户端配置。但同样,复制servicemodel部分应该足够了。

答案 1 :(得分:0)

它与通过反射调用无关。出现错误消息表明无法找到Mylibrary.dll.config中的配置。如果您在没有将配置添加到新程序的app.config(或web.config)的情况下直接引用Mylibrary.dll来调用客户端代码,则会出现相同的错误。

MyService.MyServiceClient client = new MyServiceClient(); 

默认情况下,上面的代码将查看当前正在运行的进程的配置文件并查找<system.servicemodel>。您的新程序的配置需要将Mylibrary.dll.config文件中的信息添加到其配置文件中。否则,您必须直接在代码中配置客户端。