2011-08-16 9 views
2

これは、フリークなWCF自動生成クライアント作業を作成する方法です。再現が容易で、すべての要素がコピーされ貼り付けられるだけで、コマンドプロンプトが必要です。 cmd.exeWCF、svcutil.exe:Webサービスクライアントコードを正しく一致または構成する方法

Test.csがある
: 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 

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> 

あなたが見ることができるように、@contractがありますIXTraceであり、@nameGurkeである。だから不一致はいつですか?

ConfigurationName="IXTrace"〜を変更して再コンパイルしても問題は解決しません。同じエラーです。

この特定の問題については、より大きな問題は、どのようにビットとピースが一緒に演奏されるべきかを理解することです。ハウツーモードでの作業をやめ、設定問題の壁に頭をぶつけることができます。ポインタを歓迎します。 app.config

更新

XTrace.cs
<endpoint name="Heinz" contract="moin.moin.IXTrace" ... 

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

ソリューションは、シクストの答えにコメントしています。恐ろしい設定ファイルの名前が間違っていて、相談していなかったので、うまくいきませんでした。実際には、私はコンパイルのためにそれを必要としませんでした、単純なcsc Test.cs XTrace.csは十分だったでしょう。設定ファイルはEXE名と一致する必要がありますので、Test.exeではTest.exe.configであるはずです。

答えて

1

(system.serviceModel/client/endpoint要素内の)contract属性に、IXTraceインターフェイスの完全修飾名前空間が含まれていることを確認します。 XTrace.csファイルでC#名前空間宣言を検索します。

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 
    } 
} 
+0

ありがとう、Sixto。次のコードのように宣言されている場合、契約属性には "YourService.IXTrace"が含まれている必要があります。あなたの指針は私に数回の実験をさせました。だから、少なくとも私は、 'System.ServiceModel.ServiceContractAttribute'の' ConfigurationName'と 'app.config'の' endpoint/@ contract'が一致するはずです。同様に、 'endpoint/@ name'とコンストラクタの文字列引数は一致すると思われます。私はそれを動作させることに成功しませんでしたが、私はあなたの提案に従いましたが、これは[他のユーザによって確認されました](http://stackoverflow.com/q/24993/269126)。変わったことだけではうまくいかない。 – Lumi

+1

問題は実際にはCSCコマンドのappconfigスイッチです。そのスイッチをCSCコマンドから削除し、Test.exe.configという名前のapp.configファイルのコピーを作成します。また、WSDLのSvcUtil生成コードは、contract = "IXTrace"が正しい値であるように、ネームスペースにIXTraceインターフェイスをラップしません。 –

+0

はい、そうでした! 'ren app.config Test.exe.config'いつも正しいです、設定ファイルの名前だけが一致しませんでした。後発の場合、生成されたコードファイル内の 'System.ServiceModel.ServiceContractAttribute(... ConfigurationName =" ??? "')とのマッチングは 'endpoint/@ contract'でなければならず、任意の文字列にすることができます。同様に、 'endpoint/@ name'はあなたのクライアントのコンストラクタに提供する文字列と一致しなければなりません。例えば' new XTraceClient( "Heinz") 'です。 – Lumi

関連する問題