VB.NET WCF の使い方

(Visual Studio 2015 版)

投稿日 2015/11/03

[Home] | VB.NET インデックス

概要

WCF は デスクトップアプリケーションなどからローカルなオブジェクトを扱うようにメソッドの呼び出しによりウェブサービスを利用するための技術です。

WCF ウェブサービスは IIS の仮想フォルダ上にアプリケーションとして配置します。

プロジェクトの作成

まず新しいプロジェクトでテンプレート WCF の中の WCF サービスアプリケーションを選択して、名前を変更後 OK ボタンをクリックします。

プロジェクトが作成されると、ソリューションエクスプローラが一例として下のような構成になります。

IService1.vb と Service1.svc.vb はテンプレートコードが挿入され次のようになります。

IService1.vb

' メモ: コンテキスト メニューの [名前の変更] コマンドを使用すると、コードと 
' config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。
<ServiceContract()>
Public Interface IService1

    <OperationContract()>
    Function GetData(ByVal value As Integer) As String
    
    <OperationContract()>
    Function GetDataUsingDataContract(ByVal composite As CompositeType) _
      As CompositeType   
      
    ' TODO: ここにサービス操作を追加します。
    
End Interface

' サービス操作に複合型を追加するには、以下のサンプルに示すようにデータ 
' コントラクトを使用します。

<DataContract()>
Public Class CompositeType

    <DataMember()>
    Public Property BoolValue() As Boolean
    
    <DataMember()>
    Public Property StringValue() As String
    
End Class

Service1.svc.vb

' メモ: コンテキスト メニューの [名前の変更] コマンドを使用すると、コード、svc、
' および config ファイルで同時にクラス名 "Service1" を変更できます。
' 注意: このサービスをテストするために WCF テスト クライアントを起動するには、
' ソリューション エクスプローラーで Service1.svc または Service1.svc.vb を選択し、
' デバッグを開始してください。
Public Class Service1
    Implements IService1
    
    Public Sub New()
    End Sub
    
    Public Function GetData(ByVal value As Integer) As String _
      Implements IService1.GetDa   ta
        Return String.Format("You entered: {0}", value)
    End Function
    
    Public Function GetDataUsingDataContract(ByVal composite As CompositeType) _
      As Compos   iteType Implements IService1.GetDataUsingDataContract
        If composite Is Nothing Then
            Throw New ArgumentNullException("composite")
        End If
        If composite.BoolValue Then
            composite.StringValue &= "Suffix"
        End If
        Return composite
    End Function
    
End Class


サンプル

IService1.vb テンプレートのカスタマイズ

このファイルはサーバ側とクライアント側のインターフェースを定義します。

まずサービスの名前ですが、変更する場合はソリューションエクスプローラで、このファイルを選択して「名前の変更」メニューを使って変更します。独自にエディタで変更すると変更すべき個所が多いためうまくいきません。

次にテンプレートのメソッドは一例なので自分のアプリケーションに合わせて削除するなり、書き換えたりします。


Service1.svc.vb テンプレートのカスタマイズ

このファイルはソリューションエクスプローラでは Service1.svc となっています。「コードの表示」を実行するとコードが表示されます。

名前を変更する場合は、IService1.vb 同様、ソリューションエクスプローラで変更します。これだけだとクラス名は変更されないので、クラス名にカーソルを合わせて「名前の変更」メニューを使って変更します。

IService1.vb の変更が終わったら、そのインターフェースに合わせてメソッドを実装します。

実行

プロジェクトを選択して「開始」ボタンをクリックするとエラーがなければ、ブラウザが起動して次のような画面が表示されます。

この中から、svc ファイルを選んでクリックすると次のような画面が表示されれば OK です。


実装例

次の例は SQL Server 上に作成したテーブル color にクエリーを行って結果を取得するものです。このテーブルは Web カラーを保持しており、color_name (色の名前) と color_code (色の値) の2つのフィールドを持っています。

IMyService.vb

' メモ: コンテキスト メニューの [名前の変更] コマンドを使用すると、コードと 
' config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。
<ServiceContract()>
Public Interface IMyServce

    <OperationContract()>
    Function GetColorValue(ByVal name As String) As String
    
    <OperationContract()>
    Function GetColors(ByVal name As String) As ColorType()
    
    ' TODO: ここにサービス操作を追加します。
    
End Interface

' サービス操作に複合型を追加するには、以下のサンプルに示すようにデータ 
' コントラクトを使用します。

<DataContract()>
Public Class ColorType

    <DataMember()>
    Public Property Name As String
    
    <DataMember()>
    Public Property Value As String
    
End Class

MyService.svc.vb

' メモ: コンテキスト メニューの [名前の変更] コマンドを使用すると、コード、
' svc、および config ファイルで同時にクラス名 "WcfMyService" を変更できます。
' 注意: このサービスをテストするために WCF テスト クライアントを起動するには、
' ソリューション エクスプローラーで WcfMyService.svc または WcfMyService.svc.vb 
' を選択し、デバッグを開始してください。
Public Class WcfMyService
    Implements IMyServce
    
    Public Sub New()
    End Sub
    
    ''' <summary>
    ''' 色の値を得る。
    ''' </summary>
    ''' <param name="name"></param>
    ''' <returns></returns>
    Public Function GetColor(ByVal name As String) As String _
     Implements IMyServce.GetColorValue
        Dim db As New DataClasses1DataContext
        Dim rs = From x In db.color Where x.color_name = name Select x.color_code
        If rs.Any() Then
            Return rs.First()
        End If
        Return String.Empty
    End Function
    
    ''' <summary>
    ''' あいまい検索で見つかった色の一覧を得る。
    ''' </summary>
    ''' <param name="name"></param>
    ''' <returns></returns>
    Public Function GetColors(ByVal name As String) As ColorType() _
      Implements IMyServce.GetColors
        Dim colors As New List(Of ColorType)
        Dim db As New DataClasses1DataContext
        Dim rs = From x In db.color Where x.color_name Like name Select x
        If rs.Any() Then
            For Each i In rs
                colors.Add(New ColorType With _
                 {.Name = i.color_name, .Value = i.color_code})
            Next
            Return colors.ToArray()
        End If
        Return Nothing
    End Function
    
End Class

テストプログラム

ソリューションを選択して追加メニューで新しいプロジェクトを選択します。新しいプロジェクトでコンソールアプリケーションを選択してプロジェクトをソリューションに追加します。

追加メニューのサービス参照で作成した WCF サービスを参照します (探索ボタンで検出できるはずです)。そして、Imports 文でそのサービス参照を参照しておきます。

クライアントの呼び出し方ですが、前に実行した .svc ファイルの表示に書かれています。具体的には下のコードのようになります。


Imports TestMyService.ServiceReference1

Module Module1

    Sub Main()
        Dim client As MyServceClient = New MyServceClient()
        
        ' GetColorValue のテスト
        Dim colorValue As String = client.GetColorValue("black")
        Console.WriteLine(colorValue)
        colorValue = client.GetColorValue("red")
        Console.WriteLine(colorValue)
        colorValue = client.GetColorValue("cyan")
        Console.WriteLine(colorValue)
        
        ' GetColors のテスト
        Dim colors As ColorType() = client.GetColors("a*")
        If colors Is Nothing Then
            Console.WriteLine("No data.")
            GoTo 100
        End If
        For Each c In colors
            Console.WriteLine("Name:{0}, Value:{1}", c.Name, c.Value)
        Next
        client.Close()
100:
#If DEBUG Then
        Console.WriteLine("終わり")
        Console.ReadKey()
#End If
    End Sub
    
End Module

実行例を下に示します。

 

 


 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。

 このページの先頭へ..