【WCF】【C#】WCF ~ WCF に Javaクライアントでアクセスする ~

■ はじめに

 WCF で作成したサービスに、
Javaクライアントとしてアクセスする必要がありそうなので、
Java => C#(WCF) のデータ送信方法を調べてみた。

■ サンプル

前提条件

サービスの実装(C#
 * 「System.ServiceModel」を参照追加しておくこと
 * サービス側は「管理者として実行」で実行されていること
  => Visual Studio で実行するなら、Visual Studioを「管理者として実行」で実行する

サービスの実装(C#

 * プロジェクト「SampleForm」
Form1.cs
using System;
using System.ServiceModel;
using System.Windows.Forms;
using System.Diagnostics;

namespace SampleForm
{
  public partial class Form1 : Form
  {
    private ServiceHost host;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      try
      {
        this.host = new ServiceHost(typeof(SampleWcfService));
        this.host.Open();
        this.label1.Text = "Start WCF service";
      }
      catch (Exception ex)
      {
        this.label1.Text = ex.Message;
      }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      if (this.host != null)
      {
        this.host.Close();
      }
    }
  }

  [ServiceContract]
  public interface ISampleWcfService
  {
    [OperationContract]
    int Plus(int value1, int value2);
  }

  public class SampleWcfService : ISampleWcfService
  {
    public int Plus(int value1, int value2)
    {
      Trace.WriteLine("Called me?");
      return value1 + value2;
    }
  }
}
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>
補足
【1】 endpointタグのname属性は、Javaクライアントコードのメソッド名に反映されるので
       指定しておいた方がいい
 ~~~~~~
 ■ App.config
 <endpoint contract="SampleForm.ISampleWcfService"
   name="DemoWcfService" ...

 ■ Javaコード
 ISampleWcfService proxy =  service.getDemoWcfService(); // ★getDemoWcfService★
 ~~~~~~

【2】「binding="basicHttpBinding"」について
  * 「binding="mexHttpBinding"」だと、Javaでの接続でうまいこといかなかった

クライアントの実装(Java

 * 以下のサイトでEclipseGUIからJavaコードを生成しているが、
   ここでは、wsimportコマンドを使ってコードを自動生成する方法を取り上げる
https://social.msdn.microsoft.com/Forums/en-US/f187404c-ba01-4832-a03e-f50ffadb8d26/c-wcf-service-and-java-client?forum=wcf
Javaクライアント作成手順
[1] ブラウザに「http://localhost:8888/SampleWcfService」にアクセス
 => 「svcutil.exe http://localhost:8888/SampleWcfService?wsdl」を確認

[2] コマンドプロンプトを立ち上げ、wsimportコマンド(※)を使い、
    Javaクライアント側のコードを自動生成する
~~~~~
wsimport -keep -p com.sample.wcf.client http://localhost:8888/SampleWcfService?wsdl
~~~~~
 => 「./com/sample/wcf/client」配下に以下のJavaコード群を確認する
   + ISampleWcfService.java
   + ObjectFactory.java
   + package-info.java
   + Plus.java
   + package-info.java
   + PlusResponse.java
   + SampleWcfService.java

[3] [2]のJavaコードを組みこみ、さらに呼び出し側のコードを作成(以下のサンプルを参照)

※ wsimportコマンドの詳細については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/36130626.html
サンプル
import com.sample.wcf.client.ISampleWcfService;
import com.sample.wcf.client.SampleWcfService;

public class Main {

  public static void main(String[] args) {
    SampleWcfService service = new SampleWcfService();
    ISampleWcfService proxy =  service.getDemoWcfService();
    Integer result = proxy.plus(12, 24);
    System.out.println("Result : " + result);
  }
}
実行結果 (「サービスの実装(C#)」を立ち上げておくこと)
Result : 36


関連記事

WCF

WCF ~ 基礎知識編 ~
https://blogs.yahoo.co.jp/dk521123/22254537.html
WCF ~ Hello World編 ~
https://blogs.yahoo.co.jp/dk521123/31872515.html
WCF ~ App.configを付加 ~
https://blogs.yahoo.co.jp/dk521123/31874697.html
WCFJavaでアクセスした際のトラブルシューティング
https://blogs.yahoo.co.jp/dk521123/37972170.html

Java

Webサービス / Metro [2] ~入門編 / クライアントサイドの構築 ~
https://blogs.yahoo.co.jp/dk521123/36140561.html
wsimportコマンドによる Web サービス・クライアントの作成
https://blogs.yahoo.co.jp/dk521123/36130626.html