これは、フリークなWCF自動生成クライアント作業を作成する方法です。再現が容易で、すべての要素がコピーされ貼り付けられるだけで、コマンドプロンプトが必要です。 cmd.exe
でWCF、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
であり、@name
はGurke
である。だから不一致はいつですか?
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
であるはずです。
ありがとう、Sixto。次のコードのように宣言されている場合、契約属性には "YourService.IXTrace"が含まれている必要があります。あなたの指針は私に数回の実験をさせました。だから、少なくとも私は、 'System.ServiceModel.ServiceContractAttribute'の' ConfigurationName'と 'app.config'の' endpoint/@ contract'が一致するはずです。同様に、 'endpoint/@ name'とコンストラクタの文字列引数は一致すると思われます。私はそれを動作させることに成功しませんでしたが、私はあなたの提案に従いましたが、これは[他のユーザによって確認されました](http://stackoverflow.com/q/24993/269126)。変わったことだけではうまくいかない。 – Lumi
問題は実際にはCSCコマンドのappconfigスイッチです。そのスイッチをCSCコマンドから削除し、Test.exe.configという名前のapp.configファイルのコピーを作成します。また、WSDLのSvcUtil生成コードは、contract = "IXTrace"が正しい値であるように、ネームスペースにIXTraceインターフェイスをラップしません。 –
はい、そうでした! 'ren app.config Test.exe.config'いつも正しいです、設定ファイルの名前だけが一致しませんでした。後発の場合、生成されたコードファイル内の 'System.ServiceModel.ServiceContractAttribute(... ConfigurationName =" ??? "')とのマッチングは 'endpoint/@ contract'でなければならず、任意の文字列にすることができます。同様に、 'endpoint/@ name'はあなたのクライアントのコンストラクタに提供する文字列と一致しなければなりません。例えば' new XTraceClient( "Heinz") 'です。 – Lumi