- PR -

Webサービスの開発とデバッグ

投稿者投稿内容
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-10-29 17:48
 Webサービスとクライアント書いていて、ふと思ったのですが。
 クライアントはWebサービスへのURLが直接埋め込まれているので、Webサービスをテストマシンからサーバに持っていくと、動きません
 さて、どう対処しましょうか?

_________________
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2001-10-29 18:34
引用:

autumnさんの書き込み (2001-10-29 17:48) より:
 クライアントはWebサービスへのURLが直接埋め込まれているので、Webサービスをテストマシンからサーバに持っていくと、動きません
 さて、どう対処しましょうか?


埋め込まないようにします。UDDIやDISCO、ADSがキーワードとしてあげられます。
WSDL.EXEで作られるプロキシ、asmx?wsdlで作られるWSDL、みんなServicesと
それ以外を1つにしていますが、これは間違っています。IBMツールのように、
WSDLもインターフェイスと実装の分離を行うべきです。そうでないと、その
サービス*実装*と密結合してしまいます。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-10-30 13:42
引用:

NothingBut.NETFWさんの書き込み (2001-10-29 18:34) より:
埋め込まないようにします。UDDIやDISCO、ADSがキーワードとしてあげられます。
WSDL.EXEで作られるプロキシ、asmx?wsdlで作られるWSDL、みんなServicesと
それ以外を1つにしていますが、これは間違っています。IBMツールのように、
WSDLもインターフェイスと実装の分離を行うべきです。そうでないと、その
サービス*実装*と密結合してしまいます。


 インターフェースと実装が密結合することの問題は解ります。
 メソッドの手前に[WebMethod]アトリビュートなんか付けて書いていたら、密結合してしまいますね。
 でも、私が引っかかったのは、ちょっと違う点です。
 プログラムを開発中に使うテストサーバは、テスト中のアプリだけから参照できれば良いのであって、外部からダイナミックにdiscoveryされても困るのですよ。
 クライアント側がデバッグビルドの時と、リリースビルドの時で、別のサーバにアクセスするような構成を手軽に取れたら嬉しいな、というような低次元の考えだったりします
_________________
sib
会議室デビュー日: 2001/09/21
投稿数: 6
投稿日時: 2001-10-30 15:11
外出先でちょっとちゃんと調べられないのですが、
WebService クラスのターゲットの URI を示すプロパティが
あって、それは Public です。
これを書き換えるようなコードを書いて、条件コンパイル
すればいいのでは?

私の場合は、テストプログラムはWebページとして作っているので、
WebService を localhost で参照しておいて、公開用サーバーに
移すときはそのテストページも一緒に移してしまうという方法で
対処しています。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-10-30 16:15
引用:

sibさんの書き込み (2001-10-30 15:11) より:
外出先でちょっとちゃんと調べられないのですが、
WebService クラスのターゲットの URI を示すプロパティが
あって、それは Public です。
これを書き換えるようなコードを書いて、条件コンパイル
すればいいのでは?


 情報感謝。
 作ってみました。
 デバッグビルドの場合のみ、本来指定されたURLとは別のURLにアクセスします。
 なお、ConsoleApplication103.localhost.Service1はWeb参照で自動生成されたクラスです。
コード:
using System;

namespace ConsoleApplication103
{
	class MyService : ConsoleApplication103.localhost.Service1
	{
		public MyService()
		{
#if DEBUG
			this.Url = "http://erika.piedey.co.jp/WebService1/Service1.asmx";
#endif
		}
	}
	class Class1
	{
		static void Main(string[] args)
		{
			MyService svc = new MyService();
			Console.WriteLine( svc.HelloWorld() );
		}
	}
}


 もちろん、動きました。
_________________
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2001-10-30 17:09
引用:

autumnさんの書き込み (2001-10-30 13:42) より:
 メソッドの手前に[WebMethod]アトリビュートなんか付けて書いていたら、密結合してしまいますね。



??
WebMethodが問題なのではありません。そのあとのWSDLの話をしています。

とはいえ、そういうコトではなかったようで。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2001-10-30 22:44
すでに解決されているようですが。。。

Reflectionを使ってプロキシのクラスを呼び出すようにするのも一つの手かなと思います。
この場合、実行環境に持っていったときにWSDL.exeが作成するプロキシだけを
作り直せば動くように作れますね。

まぁ、開発やデバッグの手間は余計にかかるところがあるような気がしますが。。。


autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-10-31 13:46
引用:

NothingBut.NETFWさんの書き込み (2001-10-30 17:09) より:
??
WebMethodが問題なのではありません。そのあとのWSDLの話をしています。


 失礼しました。
 別のことを考えていたようです。
 これは、生成されるWSDLファイルの中に、インターフェースの定義と、サービスの具体的な場所の両方が書いてあるのが問題だ、という認識でよろしいでしょうか?

 この手の話題は重要であるような気がしますので、「Webサービスをツマミにするディスカッション大会」でも取り上げると良いと思います。@IT加部さん、どうですか?

 ちなみに私はC#のことはやっと分かってきましたが、Webサービスは初心者なので、変なことを言うかも知れませんが、よろしく御願いいたします。

_________________

スキルアップ/キャリアアップ(JOB@IT)