none
Webサービスを使用するクラスライブラリを ASP.NETアプリでコールするときの問題 RRS feed

  • 質問

  • --------------------------------
    【アプリの設定状況】
    --------------------------------
    Visual Studio 2008でASP.NET2.0のWEBアプリケーションを作成しています。
    (.NET Frameworkは2.0を使用)
    ソリューション内には以下の2つがあります。

    ①ビジネスロジックを実装するクラスライブラリ(以下『①BizLogic』と呼びます)
    ②UIを提供するASP.NETのWEBアプリケーション(以下『②Webアプリ』と呼びます)

    ここで①BizLogicは、他のサーバ上にあるWebサービスを使用します。
    従って、クラスライブラリ内でWebサービスへの参照設定を行い、プロパティ上
    WebサービスのURL動作は『ダイナミック』として、app.Configの設定で書き換えら
    れるようにしてあります。

    こうすると、URL設定はapp.Config内の
    </applicationSettings><[名前空間]Properties.Settings>以下の<setting>エントリ
    に書き込まれます。

    --------------------------------
    【やろうとしていること】
    --------------------------------
    ①BizLogicがコールするWebサービスは、テスト用サーバと本番サーバを切替ながら
    実行しようと思っています。WebサービスのURLは『ダイナミック』なので、
    設定ファイル([クラスライブラリ名.Config)の上記<setting>エントリの値を
    書き換えて実行したいと思っています。

    --------------------------------
    【問題点】
    --------------------------------
    ところがビルドして②Webアプリ側を見てみると、どこにも①BizLogic側の設定ファイル
    が移されていません。(=②Webアプリ本体のWeb.configにも当然書き込まれていません)

    即ち。。。

    『①BizLogic側では動的に設定できたWebサービスのURLが、WEBアプリに配置すると
     固定化してしまう』

    ということになるのでしょうか?

    もしそうであれば、Webサービスをコールする処理だけでも②WebアプリのApp_Code側
    に配置するよう、プログラムを書き直す必要が生じます。(=または①BizLogic側に
    2つのWebサービス参照を置いて、どちらを使用するかを切り替えるとか・・・)

    --------------------------------
    【ずばり知りたい事】
    --------------------------------
    クラスライブラリ側で『ダイナミック』に作成したWebサービス参照は、それを使用する
    他のアプリで利用される場合、DLL内でURL向き先が固定されてしまっているのでしょうか
    または、使用するアプリ側でそのDLL内のWebサービスURLの向き先を変更するような方法
    があるのでしょうか?

    これについては拙者が探した限りネット上に有益な情報がありませんでした。
    何方かご存知の方、お知恵を拝借できればと思います。

    以上、よろしくお願いいたします。

    2011年2月9日 4:25

回答

  • Web.configにWeb参照設定を書くことで実現できます。

    http://msdn.microsoft.com/ja-jp/library/ms246220(v=vs.90).aspx

    すごく読みづらい日本語なのですが、MSDNの解説記事をどうぞ。

    • 回答としてマーク 山本春海 2011年2月23日 8:24
    2011年2月9日 9:06
  • アプリケーション上で、動的に変更する方法を紹介します。

     

    BizLogic.dllで参照してるWebサービスのプロキシクラスのインスタンスが hogeService だとすると

    hogeService.Url = new Url("http://my-server/hoge");
    
    という風に、変更できます。

     

    IIS上のWebアプリでDLLがロードされると、読み込まれる構成ファイルは、そのWebアプリのweb.configだけです。

    構成ファイルは1つしか読み込んでくれません。

    BizLogic.configというファイルがあったとしても参照してくれないので、期待した情報が得られないというわけです。

     

    私は、いつもDLL用の設定ファイルを別に作っておいて、自分で読み込みのコードを書いて読むようにしています。

    Webアプリケーションだと、確か

    AppDomain.CurrentDomain.SetupInformation.ApplicationBase
    

    あたりのパスがアプリケーションルート近辺だったと思います。

     

    HttpServerUtility.MapPath
    
    から取った方が好ましいかもしれません。

     

     

     

    • 回答としてマーク 山本春海 2011年2月23日 8:24
    2011年2月9日 14:48

すべての返信

  • Web.configにWeb参照設定を書くことで実現できます。

    http://msdn.microsoft.com/ja-jp/library/ms246220(v=vs.90).aspx

    すごく読みづらい日本語なのですが、MSDNの解説記事をどうぞ。

    • 回答としてマーク 山本春海 2011年2月23日 8:24
    2011年2月9日 9:06
  • アプリケーション上で、動的に変更する方法を紹介します。

     

    BizLogic.dllで参照してるWebサービスのプロキシクラスのインスタンスが hogeService だとすると

    hogeService.Url = new Url("http://my-server/hoge");
    
    という風に、変更できます。

     

    IIS上のWebアプリでDLLがロードされると、読み込まれる構成ファイルは、そのWebアプリのweb.configだけです。

    構成ファイルは1つしか読み込んでくれません。

    BizLogic.configというファイルがあったとしても参照してくれないので、期待した情報が得られないというわけです。

     

    私は、いつもDLL用の設定ファイルを別に作っておいて、自分で読み込みのコードを書いて読むようにしています。

    Webアプリケーションだと、確か

    AppDomain.CurrentDomain.SetupInformation.ApplicationBase
    

    あたりのパスがアプリケーションルート近辺だったと思います。

     

    HttpServerUtility.MapPath
    
    から取った方が好ましいかもしれません。

     

     

     

    • 回答としてマーク 山本春海 2011年2月23日 8:24
    2011年2月9日 14:48
  • miuras_netさん、Tomoyuki Fujitaさん、こんにちは。
    さとくんパパ♪です。お世話になっています。

    レス有り難うございました。大変参考になりました。

    --------------------------------
    miuras_netさんに教えていただいたMSチュートリアルの推奨する方法は、
    BizLogic(DLL)側のapp.Config内の

    <configSections>と<applicationSettings>

    の2つのセクションをWebアプリ側のWeb.Configにコピーするという方
    法ですね。<configSections>をコピーしないと<applicationSettings>
    を認識せずにエラーになってしまうことが分かりました。

    --------------------------------
    これも有効な方法ですが、今回はTomoyuki Fujitaさんに教えて頂いた
    方法を採用する事にします。

    プロキシクラスインスタンスの後ろにもしやと思ってピリオドを打っ
    たら、本当にUrlを初めとするWebサービスで生成されるリモートオブジ
    ェクト(=というかそれのプロキシ)専用のプロパティがIntellisence
    で表示されるのですね!これにはびっくりしました。

    ここでURLを動的に書き換える方が(エレガントかどうかは別にして)
    今回作成するプログラムの性格にあっているような気がして、この方法
    を採用しました。

    ちなみにこれこそ全くエレガントではないのですが、この動的に変更す
    るWebサービスのurlはweb.Configの<appSettings>セクションに
    <add Key="URL_WebService_HogeHoge" Value="http://www.somewhere...">
    のようにしました。(ダサいですが)

    --------------------------------
    それと備忘録のため、今回の調査で気づいたことも書き足しておきます。

    1.BizLogic側でコールするWebServiceは、URL動作を『ダイナミック』に
      指定しても、app.configの指定でDLL内ではWebサービスのURLを固定(=
      スタティックと同じ状態)してしまう(らしい)

    2.WebサービスのURLに指定したサーバ自体に問題があると(=例えば
      SSL設定したサーバであるにも関わらずサーバー証明書を他のサーバ
      から取ってきたものをコピーしただけのテストサーバだったりしたら)
      動的に指定してプロキシクラスの生成までは行くのですが、実行時に
      例外となります。

    以上、ご報告まで

    miuras_netさん、Tomoyuki Fujitaさん、改めてどうもありがとう
    ございました。

    2011年2月10日 3:02
  • 2.WebサービスのURLに指定したサーバ自体に問題があると(=例えば

      SSL設定したサーバであるにも関わらずサーバー証明書を他のサーバ
      から取ってきたものをコピーしただけのテストサーバだったりしたら)
      動的に指定してプロキシクラスの生成までは行くのですが、実行時に
      例外となります。

    参考にしていただきありがとうございます。

    証明書エラーは、そのサイトが安全だと確信できるのでしたら、無視する方法もありますよ。

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
    
    private bool OnRemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
    	// 信用したことにする
    	return true;
    }
    

    static変数での設定で、アプリケーション全体(正確にはAppDomain)のすべての通信に影響します。
    社内限定のシステムを作ったときは、無視するようにしたことがあります。

    このイベントは、本来は、アプリケーションで証明書の期限や認証機関を(引数から)取得して、ユーザに了承するか問い合わせるダイアログを作ったりするときに活躍するもの、だったはずです。

    2011年2月10日 4:00