【トラブル】【WCF】WCF に Javaでアクセスした際のトラブルシューティング

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37962361.html
を行った際に発生したトラブルシュートをまとめる

それ以外のWCF絡みのトラブルは以下の関連記事を参照のこと。
【トラブル】【WCFWCFに関するトラブルシューティング
https://blogs.yahoo.co.jp/dk521123/31879191.html

■ 「このサービスのメタデータ公開は現在は無効になっています」が表示

WCFのエンドポイントにブラウザでアクセスしたら(以下の「現象発生例」を参照)、
ブラウザ上に以下の「エラー内容」が表示される

エラー内容

これは Windows© Communication Foundation サービスです。

このサービスのメタデータ公開は現在は無効になっています。

このサービスにアクセスできる場合は、次の手順に従って Web または
アプリケーションの構成ファイルを変更することにより、メタデータの公開を有効にできます。

現象発生例

 * 以下のサンプルに対して、
   ブラウザで「http://localhost:8888/SampleWcfService」にアクセスする
WCF ~ Hello World編 ~
https://blogs.yahoo.co.jp/dk521123/31872515.html

原因

 * サービスのメタデータ公開が無効になっているため(エラー内容そのままだが)

解決案

 * サービスのメタデータ公開が有効にする
  => ブラウザでの表示に結構詳しく書いてあるので、落ち着いて一読した方がいいかも
  => App.config を追加し、以下の内容を追記
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- ★ 追加・ここから ★ -->
  <system.serviceModel>
    <services>
      <!-- 注意: サービス名は、サービスの実装の構成名と一致しなければなりません。 -->
      <service name="SampleForm.SampleWcfService" behaviorConfiguration="SampleWcfServiceBehaviors" >
        <!-- 次のエンドポイントを追加してください。  -->
        <!-- 注意: サービスには、このエンドポイントに追加する HTTP ベース アドレスがなければなりません。 -->
        <endpoint contract="SampleForm.ISampleWcfService"
                  name="DemoWcfService" binding="basicHttpBinding" address="Plus" />
        <host>
          <baseAddresses>
            <add baseAddress="">http://localhost:8888/SampleWcfService"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SampleWcfServiceBehaviors" >
          <!-- 次の要素をサービス動作構成に追加してください。 -->
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <!-- ★ 追加・ここまで ★ -->
</configuration>

■ 「コントラクト名 XXX は、サービス YYY によって実装されたコントラクトの一覧から見つかりませんでした。」が表示

上記の『「このサービスのメタデータ公開は現在は無効になっています」が表示』の対応で
WCFサービスを起動したら、以下の「エラー内容」の例外が発生した

エラー内容

コントラクト名 'SampleForm.SampleWcfService' は、
サービス 'SampleWcfService' によって実装されたコントラクトの一覧から見つかりませんでした。

原因

 * App.config のendpointタグのcontract属性が正しくなかった

解決案

 * App.config を修正
修正前
<endpoint contract="ISampleWcfService" binding="mexHttpBinding" address="mex" />
修正後
<endpoint contract="SampleForm.ISampleWcfService" binding="mexHttpBinding" address="mex" />

JavaクライアントでWSDLからコードジェネレートする際に「IWAB0399E」が発生

 Javaクライアント作成において
「http://localhost:8888/SampleWcfService?wsdl」を指定したら
以下の「エラー内容」が表示された

エラー内容

IWAB0399E Error in generating Java from WSDL:  java.io.IOException: 生成に失敗しました。WSDLドキュメント http://localhost:8888/SampleWcfService?wsdl=wsdl0 内に未定義のportType(ISampleWcfService)があります。 
ヒント: <binding type=".."> が十分に適したものか確認して下さい/ [en]-(Emitter failure.  There is an undefined portType (ISampleWcfService) in the WSDL document http://localhost:8888/SampleWcfService?wsdl=wsdl0.
Hint: make sure <binding type=".."> is fully qualified.)

    java.io.IOException: 生成に失敗しました。WSDLドキュメント http://localhost:8888/SampleWcfService?wsdl=wsdl0 内に未定義のportType(ISampleWcfService)があります。
    ヒント: <binding type=".."> が十分に適したものか確認して下さい/ [en]-(Emitter failure.  There is an undefined portType (ISampleWcfService) in the WSDL document http://localhost:8888/SampleWcfService?wsdl=wsdl0.
    Hint: make sure <binding type=".."> is fully qualified.)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.checkForUndefined(SymbolTable.java:596)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:715)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:734)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:543)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:518)
    at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:495)
    at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:361)
    at java.lang.Thread.run(Thread.java:744)

解決案

http://localhost:8888/SampleWcfService?wsdl」
ではなく
「http://localhost:8888/SampleWcfService?singleWsdl」
を指定する