@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

WindowsアプリからのWebServiceのデバッグ

投稿者投稿内容
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-06-04 18:54
いつも参考にさせていただいております。

現在ASP.NETとWebServiceでWebアプリを作成しています。
さらに管理用のWindowsアプリを作成し、既存のWebServiceを使用する予定です。

WebServiceのGrobal.aspx内のApplication_Startメソッドで、
アプリ共通初期処理を行っているのですが、デバッガでここに行く事ができません。
Winアプリで呼んでいるWebServiceにプレークポイントを張って所定のWebService内に
入ることはできるのですが。
どなたか、Application_Startメソッド内に入れる方法をご存知でしょうか?

あと基本的な質問なのですが、
WebServiceのApplicationオブジェクトにAddしておくということは、
IISのメモリ領域に確保されるということでよろしいのでしょうか?
この領域は、ASP.NETで使用しているApplicationの領域と同じものなのでしょうか?

よろしくお願いいたします。


unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-06-04 21:12
unibon です。こんにちわ。

引用:

みつんさんの書き込み (2005-06-04 18:54) より:
WebServiceのGrobal.aspx内のApplication_Startメソッドで、
アプリ共通初期処理を行っているのですが、デバッガでここに行く事ができません。


ファイル名は Global.asax(および Global.asax.cs 等)のはずですが、そのあたりは大丈夫でしょうか。もしファイル名が間違っているのだとしたら、デバッガー以前にそもそも Application_Start が動いていないことになります。まずはデバッガーを使わないで Application_Start が動いていることをなんらかの方法で確認されてはどうでしょうか。ファイルを作成する、Application 変数に書いて、ページで表示して見てみる等。

引用:

みつんさんの書き込み (2005-06-04 18:54) より:
あと基本的な質問なのですが、
WebServiceのApplicationオブジェクトにAddしておくということは、
IISのメモリ領域に確保されるということでよろしいのでしょうか?
この領域は、ASP.NETで使用しているApplicationの領域と同じものなのでしょうか?


領域は共通です。WebService であってもとくに通常のページと分離している部分はなさそうに思います。
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-06-04 21:52
unibonさん、早速のレスありがとうございます。

ファイル名を間違えて書いてしまいました。
WebServiceなので確かに"Global.asax"です。

Application_Startでファイルを読み込んでいるのですが、
そこで読み込みファイルパスを不正にするとエラーになるので、
Application_Startは動いていると思います。
さらにそこで設定されるオブジェクトをApplication変数にセットし、
WebServiceメソッドで参照もできます。

Application_Startメソッドは、IIS起動後、WebService呼び出しがあった
最初の一回だけ起動するという認識でよろしいでしょうか?

VSでのデバッグ手順もよくわからないのですが、
WinアプリのWebサービス呼び出し部分にブレークポイントをはっておくと
Webサービスのメソッドの中に入れますが、Application_Startメソッドは
VSでは表示できないので、ブレークポイント自体がはれません。
VSでは表示できないと思っているのがすでに間違いでしょうか?

Application領域はASP.NETで使用しているところと同じという事ですが、
WebServiceでセットしたApplication変数を、ASPでも同じApplication変数名で
取得できるということでしょうか?
先ほど試して見たのですがうまくいきませんでした。
但し、私の方がおかしい気が思いっきりしますが・・・。

何卒よろしくお願いいたします



unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-06-05 09:16
unibon です。こんにちわ。

引用:

みつんさんの書き込み (2005-06-04 21:52) より:
Application_Startでファイルを読み込んでいるのですが、
そこで読み込みファイルパスを不正にするとエラーになるので、
Application_Startは動いていると思います。
さらにそこで設定されるオブジェクトをApplication変数にセットし、
WebServiceメソッドで参照もできます。


Global.asax で Application に書き込んで WebService で読めているわけですよね。

引用:

みつんさんの書き込み (2005-06-04 21:52) より:
Application領域はASP.NETで使用しているところと同じという事ですが、
WebServiceでセットしたApplication変数を、ASPでも同じApplication変数名で
取得できるということでしょうか?
先ほど試して見たのですがうまくいきませんでした。


WebService で Application に書き込んで Page(WebService ではないページ)では読めないということでしょうか?
でも、Global.asax で書き込んで WebService で読めている Application を Page では読めているはずですよね。WebService で読めているのだから WebService で書けてもよさそうな気もします。

引用:

みつんさんの書き込み (2005-06-04 21:52) より:
Application_Startメソッドは、IIS起動後、WebService呼び出しがあった
最初の一回だけ起動するという認識でよろしいでしょうか?

VSでのデバッグ手順もよくわからないのですが、
WinアプリのWebサービス呼び出し部分にブレークポイントをはっておくと
Webサービスのメソッドの中に入れますが、Application_Startメソッドは
VSでは表示できないので、ブレークポイント自体がはれません。
VSでは表示できないと思っているのがすでに間違いでしょうか?


そうです Application_Start は一度しか動きません。WebService か Page の区別なく、どちらかが最初にアクセスされたときに一度だけ動きます。
Visual Studio .NET では、ソースコードも見られるはずですし、ブレークポイントも付けられるはずです。
もしかしたら Global.asax.cs のように分けていない(Codebehind を使っていない)のでしょうか?このあたりは良く分かりませんが。

ともあれ、Visual Studio .NET で、新規に WebService のプロジェクトを作成して、それに普通の Page(.aspx) を追加した程度の、簡単なサンプルで試してみてはどうでしょうか。

#以下、追加。

あと、Global.asax には一度しか動かない Application_Start のほかに、アクセスごとに毎回動く Application_BeginRequest などのイベントハンドラーも追加できますので、デバッグができるかなどを試すときはそっちのほうが試しやすいかもしれません。

[ メッセージ編集済み 編集者: unibon 編集日時 2005-06-05 09:20 ]
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-06-06 10:43
引用:

WinアプリのWebサービス呼び出し部分にブレークポイントをはっておくと
Webサービスのメソッドの中に入れますが、Application_Startメソッドは
VSでは表示できないので、ブレークポイント自体がはれません。
VSでは表示できないと思っているのがすでに間違いでしょうか?



引用:

さらにそこで設定されるオブジェクトをApplication変数にセットし、
WebServiceメソッドで参照もできます。



↑と書かれていますが、
Application_Startに記述したコードの処理が行われているのに、VSで表示できないというのは?
コードが記述できたのなら見えてたはずなのではないでしょうか?

引用:

Application_Startメソッドは、IIS起動後、WebService呼び出しがあった
最初の一回だけ起動するという認識でよろしいでしょうか?



そのとおりなのですが、
Application_Startイベントが発生するのがIIS起動時のWebメソッドの最初の呼び出しとなるのは、
「WebService側がデバッカーで動いていない状況下である」と認識しています。


以下は、デバッカー上でApplication_Startは見えいて、Application_Start内の処理にプレイクがはってあることが前提でが私が行っている方法です。

Application_Startの処理を毎回デバックするなら、Application_Start内のコードの必要な場所にプレイクをはった後に、
デバックする毎にWebServiceのあるIISのWebサイトの再起動をするか、
もしくはNTサービスからなら"World Wide Web Publishing"の再起動をする。
(荒っぽい手法ですが、プロセスのaspnet_wp.exe を強制終了しても可能です)
WebServiceで、「デバック」->「開始」にすれば、Application_Startのブレイクで止まるのでデバック可能です。
Webメソッドを呼ぶWinアプリ側は一切使わない、、というよりWebServiceをデバック状態で起動させたあとWinアプリ側からWebメソッドをコールするというトリガーでApplication_Start内のデバックはできないと思っています。

引用:

Application領域はASP.NETで使用しているところと同じという事ですが、
WebServiceでセットしたApplication変数を、ASPでも同じApplication変数名で
取得できるということでしょうか?



ここでいう「ASP」は何を挿してますか?
[ASP.NET Webサービス]と[ASP.NET Webアプリケーション]は、どちらもASP.NETですが?

みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-06-06 12:31
unibonさん、xxななおxxさん、色々ありがとうございます!

引用:

xxななおxxさんの書き込み (2005-06-06 10:43) より:
ここでいう「ASP」は何を挿してますか?
[ASP.NET Webサービス]と[ASP.NET Webアプリケーション]は、どちらもASP.NETですが?




はい。どちらもASP.NETです。
但し、それぞれ違うプロジェクトで別ソリューションでした。
この二つは同じサーバにセットアップされ、同じIISで動きます。

たった今同じソリューションにしてASP,WebService両方のGlobal.asaxを開き、
どちらにもブレークポイントをはり、無事デバッグができました。
なぜ気がつかなかったんでしょう。徹夜が続いて寝ぼけてたんでしょうか・・・。

ここでアプリケーションの動きとしては、
ASPのページを起動⇒ASPのGlobal.asaxのApplication_Startメソッドが呼ばれる⇒
ASP側でWebサービス呼出⇒WebサービスののGlobal.asaxのApplication_Startメソッドが呼ばれる。

ですね。いまさらですが・・・。
ここで、ASPのGlobal.asaxのApplication_StartでセットしたApplication変数
(例えばApplication.Add("ID", 1))を、
WebサービスののGlobal.asaxからはアクセスできませんでした。
(WebサービスののGlobal.asaxのApplication_Startメソッド内で
Application["ID"]はnullになる)
同じApplicationオブジェクトだったので、もしかして?と思ったのですが、
違う領域なのですね。

↑と、思っているのですが、これは間違っていないでしょうか??



壱丸3
常連さん
会議室デビュー日: 2004/09/13
投稿数: 34
投稿日時: 2005-06-06 13:16
引用:
いまさらですが・・・。
ここで、ASPのGlobal.asaxのApplication_StartでセットしたApplication変数
(例えばApplication.Add("ID", 1))を、
WebサービスののGlobal.asaxからはアクセスできませんでした。
(WebサービスののGlobal.asaxのApplication_Startメソッド内で
Application["ID"]はnullになる)
同じApplicationオブジェクトだったので、もしかして?と思ったのですが、
違う領域なのですね。



複数のASP.NET Webアプリケーション プロジェクト間で、
Application変数等のリソースを共有するためには、
それらを1つのWebアプリケーションとして構成する必要があります。
具体的にはルートとなるWebアプリケーションを追加し、
最初に作成したWebアプリケーションへ参照設定を行います。
IISのアプリケーション設定もルートWebアプリケーションのみに設定します。
Global.asaxもルートWebアプリケーションのみに配置することになります。
WebアプリケーションとWebサービスで期待する動作が実現できるか、
弊害がないかどうかは未確認ですが、ご参考まで。

上記の詳細手順は
http://support.microsoft.com/default.aspx?scid=kb;ja;307467
が参考になると思います。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-06-06 13:54
引用:

ここで、ASPのGlobal.asaxのApplication_StartでセットしたApplication変数
(例えばApplication.Add("ID", 1))を、
WebサービスののGlobal.asaxからはアクセスできませんでした。
(WebサービスののGlobal.asaxのApplication_Startメソッド内で
Application["ID"]はnullになる)
同じApplicationオブジェクトだったので、もしかして?と思ったのですが、
違う領域なのですね。

↑と、思っているのですが、これは間違っていないでしょうか??



ちょっと私の回答は的はずれでした。すみません。

プロジェクトとしては、ASP.NET(Webサービス側)とASP.NET(WebAP側)と2つがあって、
ファイルの実態として同じGlobal.asaxを参照しているということですか?
ファイルのリンク先が同じファイルを見ていたとしても、
そもそも別プロジェクト(ソリューションエクスプローラーで見ても階層が別々)の
Global.asaxなのだから、ASP.NET(WebAP側)でApplicationオブジェクトに格納しても
もう片方のASP.NET(Webサービス側)のプロジェクトにとっては、まったく別インスタンスの別物のApplicationオブジェクトですよね。

”Global”の意味は、IISやWebサイトに対してではなく、1つのプロジェクト単位のものです。

ASP.NET(WebAP側)のApplicationオブジェクトの内部の変数(オブジェクト)を利用したいなら
ASP.NET(Webサービス側)のWebメソッドでも使用して、明示的に同じもの(ここでの話なら、Application["ID"]など)を渡してあげて、Webサービス側のApplicationオブジェクトに格納しないと無理じゃないですか?

同一プロジェクトにまとめても良いですが、そうするとWebサービス化する理由がよくわからなくなります。
本来ASP.NETWebサービスだろうが、ASP.NETWebApだろうが、Webの機能なのだから
同一のPCにいること前提に2のASP.NETプロジェクトを動作させようというのは変だと感じます。
全体のプロジェクトがどこまで出来上がっているのか不明ですが、
初期段階ならWebサービスを使用しなくても同じだしわかりやすいのでは無いでしょうか?

また、”みつんさん”の前の記述で、「WinAPから呼び出し・・」とありますが、ASP.NETWebAPからもWinAPからも呼び出されるWebサービスを開発しているとしたら、別PC・別Webサイトでも動作可能な別プロジェクトのWebサービスとし作成する方がすっきりしませんか?

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