WCF,svcutil.exe:如何正确匹配或配置Web服务客户端代码?

时间:2011-08-16 09:39:08

标签: c# wcf wsdl app-config svcutil.exe

这是关于如何让令人毛骨悚然的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>

如您所见,@contractIXTrace@nameGurke。那么不匹配呢?

ConfigurationName="IXTrace"更改为ConfigurationName="Gurke"并重新编译无法解决问题:同样的错误。

这个特殊问题太多了。更大的问题是要了解这些碎片应该如何一起玩,这样你就可以停止在操作模式中工作,并且碰到配置问题的墙头(如果谷歌是任何指标,这种情况并不常见)。指针欢迎。

更新

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 个答案:

答案 0 :(得分:1)

确保contract属性(在system.serviceModel / client / endpoint元素中)包含IXTrace接口的完全限定名称空间。在XTrace.cs文件中搜索C#名称空间声明。如果接口在以下代码中声明,则contract属性应包含“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
    }
}