短いバージョン:localhost
クライアントが別のマシン上の Java である場合、 WCF Windows サービス エンドポイント アドレス構成をホスト名として使用できますか?
長いバージョン:
Windows サービスとして実行される WCF サービスがあります。このサービスのクライアントは Java で記述されており、プロキシ クラスは を使用して生成されwsimport
ます。WCF サービスのエンドポイント構成に、WCF サービスが存在するホスト名を含むアドレスが含まれている場合、Java プロキシ クラスを生成しwsimport
てクライアントを正常に実行できます。このシナリオでの WCF 構成ファイルは次のようになります。
<service name="crOps.CompanionService" behaviorConfiguration="CompanionServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://chvprdctxxa604.eu.scor.local:8432/crOpsCompanion/service"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="crOps.ICompanionService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
wsimport
プロキシを生成するコマンドは次のとおりです。
C:\Program Files\Java\jdk1.7.0_17\bin\wsimport.exe -p crOps.companion -keep http://chvprdctxxa604.eu.scor.local:8432/crOpsCompanion/service?wsdl
これはすべてうまくいきます。
ただし、この WCF サービスは約 10 台のサーバーで実行されます。私の現在の希望は、構成ファイルを「ホストに依存しない」にすることです。つまり、同じ構成ファイルがすべてのサーバーで機能することです。つまり、構成ファイルにホスト名がありません。
WCF 構成ファイルを認識する方法を少し探しましたが、何も見つかりませんでした。そこでlocalhost
、ホスト名の代わりに試してみることにしました。それはこのように見えます...
<service name="crOps.CompanionService" behaviorConfiguration="CompanionServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8432/crOpsCompanion/service"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="crOps.ICompanionService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
ただし、wsimport
コマンド (上記) を実行すると、次のエラーが発生します。
parsing WSDL...
[ERROR]
Unable to parse "http://localhost:8432/crOpsCompanion/service?wsdl=wsdl0" :
Connection refused: connect
line 1 of http://chvprdctxxa604.eu.scor.local:8432/crOpsCompanion/service?wsdl
[ERROR]
Unable to parse "http://localhost:8432/crOpsCompanion/service?wsdl=wsdl0" :
Connection refused: connect
Failed to read the WSDL document:
http://chvprdctxxa604.eu.scor.local:8432/crOpsCompanion/service?wsdl, because
1) could not find the document;
2) the document could not be read;
3) the root element of the document is not <wsdl:definitions
>.
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):
http://chvprdctxxa604.eu.scor.local:8432/crOpsCompanion/service?wsdl
At least one WSDL with at least one service definition needs to be provided.
Failed to parse the WSDL.
だから、私が知りたいのはlocalhost
、クライアントが別のマシン上のJavaの場合、WCF Windowsサービスエンドポイントアドレス構成をホスト名として使用できますか? そうでない場合、なぜですか?もしそうなら、どのように?
24時間後:
まだ解決していません。
NLB を使用するために Shiraz Bhaiji によって提案された手法は、実際、すべてのサーバーに対して 1 つの構成ファイルという私の目標の一部を達成します。エンドポイント アドレスのホスト名は、クラスターが世界に提示する「クラスター名」になり、すべてのサーバー上のすべてのサービスが同じ名前になります。
私の場合の NLB ソリューションの問題は、このサーバーを実行している各サーバーが個別に接続できる必要があることです。これは実際にはクラスター タイプのサービスではなく、12 ほどのサーバーのそれぞれを実行する必要があり、クライアントがそれぞれに個別に接続するローカル サービスに近いものです。
そして、Yaron Naveh の返信で説明されている、ローカルの WSDL ファイルを使用してプロキシを生成する手法について説明します。Java プロキシ クラスを生成することはできますwsimport
が、それらを使用して Web サービス (エンドポイント アドレスに localhost が含まれる) にアクセスすると、この例外が発生します。これは私にとって興味深いものです。これは単一の printStackTrace() 呼び出しの出力であり、他の 2 つの例外をラップしているように見えますが、スタック トレースでラップされた例外から見慣れているものとは異なります。 .
com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
javax.xml.stream.XMLStreamException: Invalid WSDL http://chvprdctxxa604:8432/crOpsCompanion/service, expected {http://schemas.xmlsoap.org/wsdl/}definitions found HTML at (lineLine number = 1
Column number = 7
System Id = http://chvprdctxxa604:8432/crOpsCompanion/service
Public Id = null
Location Uri= http://chvprdctxxa604:8432/crOpsCompanion/service
CharacterOffset = 10
)
java.io.IOException: Got Connection refused: connect while opening stream from http://localhost:8432/crOpsCompanion/service?wsdl=wsdl0
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
at javax.xml.ws.Service.<init>(Unknown Source)
at crOps.companion.CompanionService.<init>(CompanionService.java:58)
at crOps.companion.Main.main(Main.java:14)
スタック トレースで、プロキシ クラスが実行時に WSDL を取得するために接続しようとしていることに気付きましたlocalhost
が、プロキシは localhost への参照を含まない WSDL で生成されました。ただし、WCF サービスによって発行された WSDL には、<wsdl:import>
要素に localhost 参照が含まれています。
<wsdl:import namespace="http://crOps.CompanionService" location="http://localhost:8432/crOpsCompanion/service?wsdl=wsdl0" />
location
そのため、Java は属性内の WSDL を取得しようとしていますが、取得できません。
C# で記述された WCF クライアントは同じことを行うのでしょうか? つまり、WCF クライアントは、実行時に<wsdl:import>
のlocation
属性で指定された WSDL にアクセスする必要がありますか? Java の場合と同じ手順で WCF クライアント プロキシを作成しました。参照なしの WSDL を使用してプロキシ クラスを生成し、WCF エンドポイント アドレス構成にlocalhost
構成ファイルが含まれている WCF サービスにアクセスしました。localhost
これはうまくいきます!WCF クライアントは、要素のlocation
属性で指定された WSDL を実行時に取得できる必要はありません。<wsdl:import>
だから今、これは私の目には Java/wsimport の質問になりました。
私の脳は今疲れています。後で戻ってきて、このテキストの壁をきれいにして、誰かが読んで返信したくなるようなものにします.