Visual Studio の基本的な HttpBinding とエンドポイントの問題
-
09-06-2019 - |
質問
VS 2008 に Web サービス参照を含む WPF アプリケーションがあります。さまざまな理由 (最大メッセージ サイズ、認証方法) により、WPF クライアントの app.config でサービス バインディングの多くの設定を手動で定義する必要があります。
残念ながら、これは、プロジェクト内のサービス参照を更新すると、複数のバインディングとエンドポイントが発生し、混乱が生じることを意味します。Visual Studio は、数値サフィックスを持つ新しいバインディングとエンドポイント (つまり、「Service」の複製として「Service1」) を作成します。その結果、プロジェクト内のサービス参照ごとにバインディングが 1 つしか存在しないため、無効な構成が発生します。
これは簡単に複製できます。単純な「Hello World」ASP.Net Web サービスと WPF アプリケーションをソリューション内に作成し、app.config バインディングの maxBufferSize と maxReceivedMessageSize を変更して、サービス参照を更新するだけです。
現時点では、参照を更新した後に app.config のチェックアウトを取り消すことでこの問題を回避していますが、もっと良い方法があるはずだと思わずにはいられません。
また、手動で変更する必要がある設定は次のとおりです。
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
そして:
<binding maxBufferSize="655360" maxReceivedMessageSize="655360" />
サービス ファクトリ クラスを使用しているため、これらの設定を何らかの方法でプログラムで設定できれば機能しますが、プロパティは公開されていないようです。
解決
プロキシ生成に svcutil を使用し、プロジェクトに適した設定を持つ .Bat ファイルを作成します。かなり簡単です。インターフェースが変更されるたびにバットファイルをクリックして新しいプロキシファイルを生成するのは簡単です。
このバッチは、後で自動ビルドで使用できます。その後、app.config (または web.config) を 1 回セットアップするだけで済みます。通常、開発、テスト本番など、環境ごとに異なる構成を分離します。
例 (改行に注意してください):
REM generate meta data
call "SVCUTIL.EXE" /t:metadata "MyProject.dll" /reference:"MyReference.dll"
REM making sure the file is writable
attrib -r "MyServiceProxy.cs"
REM create new proxy file
call "SVCUTIL.EXE" /t:code *.wsdl *.xsd /serializable /serializer:Auto /collectionType:System.Collections.Generic.List`1 /out:"MyServiceProxy.cs" /namespace:*,MY.Name.Space /reference:"MyReference.dll"
:)
//W
他のヒント
uou では、生成されたエンドポイントを変更するのではなく、必要な構成を使用して 2 番目のエンドポイントとバインディング定義を追加し、コード内でサービス クライアント コンストラクターに新しいエンドポイントの名前を入力するだけで済みます。
どういうわけか、私は Visual Studio の「サービス参照の追加」機能を使用するよりも、svcutil.exe を直接使用することを好みます。:P これが、WCF プロジェクトで行っていることです。
おっしゃるとおり、svcutil はサービス参照を追加および更新するより高度な方法であることは間違いありません。「右クリックして参照を更新」が 1 つのステップで完了するのに非常に近い場合、手作業がかなり多くなります。
参照コードを出力するだけのバッチファイルか何かを作成できると思います。それでも、svcutil を使用してサービス コードを手動でチェックアウトして更新することは、構成のチェックアウトを単に取り消すよりもおそらく手間がかかるでしょう。
いずれにしてもアドバイスをありがとうございます。
svcutil.exe ユーティリティによって自動生成された app.config および *.cs ファイルを (ソース管理から) チェックアウトし、svcutil.exe を実行するバッチ ファイルを実行してサービス メタデータを取得します。それが完了したら、コードを再コンパイルして動作することを確認し、更新された app.config ファイルと *.cs ファイルをチェックして戻します。これは、Visual Studio でバグの多い「サービス参照の追加」を使用するよりもはるかに信頼性が高くなります。