WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

ローカル .wsdl ファイルからプロキシ作成

by WebSurfer 2020年5月11日 12:06

.NET Framework アプリから Web / WCF サービスに接続して情報を取得する場合、Visual Studio の「サービス参照の追加」を利用してアプリと Web / WCF サービス間のインターフェイスとなるプロキシクラスを生成し、それを利用すると思います。

サービス参照の追加

Microsoft のチュートリアルなどでは、上の画像で[アドレス(A):]に設定するのはサービスの URL(例: http://example.com/service.svc)という記述しか目にしてこなかったので、URL 以外はダメだと思い込んでいましたが、実はローカルの .wsdl ファイルでも OK でしたという話を書きます。

Microsoft のドキュメント「Web サービス プロキシの作成」に ".NET Framework SDK には、Web サービス記述言語ツール (Wsdl.exe) が含まれています。これにより、.NET Framework 開発環境で使用する Web サービス プロキシを生成できます" という記述があります。

その記事のコード例では、やはりサービスの URL を設定していますが、Wsdl.exe のヘルプ(以下の画像参照)を見るとローカル .wsdl ファイルのパスでもよさそうです。

Wsdl.exe のヘルプ

一方、.wsdl ファイルですが、@IT の記事「WSDL:Webサービスのインターフェイス情報」によると十分なインターフェイス情報が含まれているようで、それからプロキシクラスが生成できないわけはなさそうです。

Visual Studio も「サービス参照の追加」ウィザードには Wsdl.exe を使っているはずです。なので、自分が作った Web サービスから .wsdl ファイルを作り、それを自分の PC のローカルフォルダにおいて、そのバスを「サービス参照の追加」ダイアログの[アドレス(A):]に設定して試してみました。

結果、以下の通りプロキシクラスを生成できます。

生成されたプロキシクラス

アプリから生成されたプロキシクラスを使って Web サービスに接続し、期待通りの結果が得られることも確認できました。

実際に URL ではなくローカルの .wsdl ファイルからプロキシクラスを作成しなけれなならないケースがどれぐらいあるのか分かりませんが、Visual Studio でこういうこともできるということで参考になれば幸いです。

(ちなみに http://example.com/service.svc というサービスの URL から .wsdl ファイルをダウンロードするには、その URL に ?wsdl というクエリ文字列を追加して要求をかけます。)

Tags: , ,

DevelopmentTools

JSON 文字列から C# のクラス定義生成

by WebSurfer 2020年5月10日 14:24

Newtonsoft.Json などを利用して JSON 文字列を C# のオブジェクトにデシリアライズする際、C# のオブジェクトのクラス定義が必要ですが、Visual Studio を利用してクラス定義を得ることが可能です。

JSON 文字列から C# のクラス定義生成

JSON 文字列をコピー(クリップボードに取得)し、Visual Studio のエディタ上でコードを張り付けたい場所にカーソルを置き、上の画像のように[編集(E)]⇒[形式を選択して貼り付け(S)]⇒[JSON をクラスとして張り付ける(J)]でカーソルの場所に C# のクラス定義が生成されます。

(VS2019 と VS2015 で確認。ちなみに、英語版 Visual Studio では [Edit] ⇒ [Paste Special] ⇒ [Paste JSON As Classes] となります)

具体的には、例えばある Web API の仕様として以下の JSON 文字列のサンプルが公開されていたとします。

{    
  "request":
  {
    "transaction":
    {
      "id" : "10",
      "server" : "10"
    },
    "list" :
    [
      { "group" : "1", "data" : "XXXXX" },
      { "group" : "1", "data" : "XXXXX" }
    ]
  }
}

C# のアプリケーションでこの Web API にアクセスして JSON 文字列を取得して利用する場合は、その JSON 文字列を C# のオブジェクトにデシリアライズすることになります。

デシリアライズに、例えば Newtonsoft.Json の DeserializeObject<T>(String) メソッドを使う場合 T のクラス定義が必要になります。

その場合、上の JSON 文字列をコピー(クリップボードに取得)して、この記事の一番上の画像のように Visual Studio を操作すれば以下の画像の通りカーソルを置いた場所にクラス定義が生成されます。

生成されたクラス定義

DeserializeObject<T>(String) メソッドの T は上の画像でいうと Rootobject になりますので、それを使って Rootobject 型の C# のオブジェクトにデシリアライズできます。

知ってました? 実は自分は最近まで知らなかったです。(汗)


【2023/12/24 追記】

VB.NET の場合ですが、この記事の機能を使って生成したクラス定義ではデシリアライズできないケースがあったので、忘れないように書いておきます。

例えば、上に書いた Visual Studio の機能を使って、以下の JSON 文字列から、

{
  "Response": [
    {
      "Version": 1,
      "StatusCode": "OK",
      "Data": [ "12", "34", "56" ]
    },
    {
      "Version": 2,
      "StatusCode": "NG",
      "Data": [ "78", "90", "02" ]
    }
  ]
}

VB.NET のクラス定義を生成すると以下のようになります。

Public Class Rootobject
    Public Property Response() As Response
End Class

Public Class Response
    Public Property Version As Integer
    Public Property StatusCode As String
    Public Property Data() As String
End Class

問題は Rootobject クラスの Response プロパティと Response クラスの Data プロパティの定義です。

上の JSON 文字列を System.Test.Json または Newtonsoft.json を使って、上の Rootobject, Response クラスのオブジェクトにデシリアライズしようとすると失敗して例外がスローされます。

問題を回避するには Response プロパティ、Data プロパティの定義を以下のように変更します。

Public Class Rootobject
    Public Property Response As Response()  ' 変更
End Class

Public Class Response
    Public Property Version As Integer
    Public Property StatusCode As String
    Public Property Data As String()  ' 変更
End Class

VB.NET の配列の宣言には以下のように 2 つの方法があって、前者の方が一般的なのか、この記事のツールも前者になります。また、配列の宣言と同時に割り当てを行う場合には前者のような書き方しかできないので、前者に統一しておくのがよいという記事も目にします。

Dim arrayA() As String
Dim arrayB As String()

しかしながら、デシリアライズに使うクラス定義のプロパティでは、上のコードで検証した限りの話��すが、配列の宣言は後者のようにする必要があるということでした。

Tags: , ,

DevelopmentTools

VS2019 で RDLC デザイナの表示

by WebSurfer 2020年4月24日 12:29

ReportViewer を使うアプリを作成する際 .rdlc ファイルを生成しますが、そのデザイナを Visual Studio Community 2019 で表示するにはどうしたらよいかを書きます。

RDLC デザイナ

Visual Studio 2015 では SQL Server Data Tool をインストールするだけで RDLC デザイナもインストールされました。ちなみに、インストールするには、コントロールパネルの「プログラムと機能」で Visual Studio 2015 を探し、それを右クリックすると [変更(C)] と出てくるのでそれをクリック、表示されるダイアログの [Modify] をクリック、表示されるダイアログで Microsoft SQL Server Data Tools にチェックを入れて UPDATE すれば OK です。

VS2015 SSDT

Visual Studio 2019 の場合、SQL Server Data Tools は下の画像のようにワークロードの「データの保存と処理」をインストールする際にオプションの「SQL Server Data Tools」にチェックを入れればインストールされます。

SSDT

しかし、それだけでは RDLC デザイナはインストールされないようです。.rdlc ファイルを開くと生の xml コードしか表示されません。

visual studio 2019 rdlc designer でググってしらべると Microsoft RDLC Report Designer という以下の記事がヒットしました。どうもこれをインストールする必要があるようです。

上のページからダウンロードしてインストールする必要はなく、Visual Studio 2019 を起動してメニューバーの[拡張機能(X)]から追加できます。以下の画像を見てください。

Microsoft RDLC レポートデザイナー

インストール後 .rdlc ファイルを開けば、この記事の一番上の画像のような RDLC デザイナ画面が表示されるはずです。自分の環境では ReportViewer v12, v15 いずれのバージョンも OK でした。

なお、Visual Studio 2017 は自分は持っていませんので、どうなっているのかは不明です。

Tags: , , ,

DevelopmentTools

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年3月  >>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar