C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: Webサービスのコンパイルタイミング


(過去ログ 34 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■17274 / inTopicNo.1)  Webサービスのコンパイルタイミング
  
□投稿者/ 烈海王 (1回)-(2008/04/21(Mon) 13:53:01)

分類:[ASP.NET (C#)] 

こんにちは。

ASP.NETを用いてWebサービスを作成しております。
環境としては仮想ディレクトリにasmxファイルとApp_Codeディレクトリ(ソースファイルが入ってる)
といった構成です。

Webサービスクラスが提供するWebメソッドが2つありまして、その2つのメソッドで
静的なインスタンスを共有したいのですが、
クライアントからWebメソッド1呼び出し⇒Webメソッド2呼び出しとすると
静的なインスタンスが初期化されてしまいます。
延々とWebメソッド1だけを呼び出す場合、静的なインスタンスは初期化されずに
更新する値を保持します。

ASP.NETの場合、WebMethod属性を付けた、同一のクラスメソッドであっても
それぞれの呼び出し時にはコンパイルが走るのでしょうか?
(コンパイル時インスタンスが破棄される)

大変お手数ですが、どなたかご教授ください。よろしくお願い致します。


引用返信 編集キー/
■17276 / inTopicNo.2)  Re[1]: Webサービスのコンパイルタイミング
□投稿者/ はつね (611回)-(2008/04/21(Mon) 14:09:20)
はつね さんの Web サイト
No17274 (烈海王 さん) に返信
> ASP.NETを用いてWebサービスを作成しております。
> 環境としては仮想ディレクトリにasmxファイルとApp_Codeディレクトリ(ソースファイルが入ってる)
> といった構成です。

1仮想ディレクトリに1asmxファイルがあって、2Webメソッドが実装されているってことですか?
そうだとすれば、JITコンパイルは2Webメソッドまとめて行われますよ。

引用返信 編集キー/
■17277 / inTopicNo.3)  Re[2]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (2回)-(2008/04/21(Mon) 15:19:26)
No17276 (はつね さん) に返信
> ■No17274 (烈海王 さん) に返信
>>ASP.NETを用いてWebサービスを作成しております。
>>環境としては仮想ディレクトリにasmxファイルとApp_Codeディレクトリ(ソースファイルが入ってる)
>>といった構成です。
>
> 1仮想ディレクトリに1asmxファイルがあって、2Webメソッドが実装されているってことですか?
> そうだとすれば、JITコンパイルは2Webメソッドまとめて行われますよ。
>
回答ありがとうございます。
そうなのですか。ただ気になっているのは
@Webメソッド1⇒Webメソッド1⇒Webメソッド1
AWebメソッド1⇒Webメソッド2⇒Webメソッド1

上記@の場合はサクサク動いてくれるのですが、
Aの場合は呼び出すメソッドが変わるたびに
5秒程の時間(@に比べるとかなり遅い)かかります。
それもあり、これはコンパイルされているのかな??と
思った次第です。



引用返信 編集キー/
■17278 / inTopicNo.4)  Re[3]: Webサービスのコンパイルタイミング
□投稿者/ はつね (612回)-(2008/04/21(Mon) 15:38:00)
はつね さんの Web サイト
No17277 (烈海王 さん) に返信
> そうなのですか。ただ気になっているのは
> @Webメソッド1⇒Webメソッド1⇒Webメソッド1
> AWebメソッド1⇒Webメソッド2⇒Webメソッド1
>
> 上記@の場合はサクサク動いてくれるのですが、
> Aの場合は呼び出すメソッドが変わるたびに
> 5秒程の時間(@に比べるとかなり遅い)かかります。

メソッドが変わるたびに遅いのですか?
それはWebメソッド側のJITコンパイルとかの話ではなく、Webサービスの接続とかの問題って事はないですか?
引用返信 編集キー/
■17279 / inTopicNo.5)  Re[4]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (3回)-(2008/04/21(Mon) 15:49:07)
No17278 (はつね さん) に返信
> ■No17277 (烈海王 さん) に返信
>>そうなのですか。ただ気になっているのは
>>@Webメソッド1⇒Webメソッド1⇒Webメソッド1
>>AWebメソッド1⇒Webメソッド2⇒Webメソッド1
>>
>>上記@の場合はサクサク動いてくれるのですが、
>>Aの場合は呼び出すメソッドが変わるたびに
>>5秒程の時間(@に比べるとかなり遅い)かかります。
>
> メソッドが変わるたびに遅いのですか?
> それはWebメソッド側のJITコンパイルとかの話ではなく、Webサービスの接続とかの問題って事はないですか?

その可能性もあるのでしょうか。@のパターンがある以上、接続の問題は関係ないと考えていました。
それと今試して気付いたのですが、Webサービスクラスはクライアントから要求があるたびに生成されるのですね。
Webサービスクラスのコンストラクタに静的インスタンスを初期化する処理を加えたら
@のパターンでも常に初期値を返すようになりました。
本件の問題(Webメソッド1とWebメソッド2で静的インスタンスを共有できていない)
これは静的インスタンスのスコープの問題なのでしょうか。


引用返信 編集キー/
■17280 / inTopicNo.6)  Re[2]: Webサービスのコンパイルタイミング
□投稿者/ 渋木宏明(ひどり) (710回)-(2008/04/21(Mon) 16:33:25)
渋木宏明(ひどり) さんの Web サイト
> 1仮想ディレクトリに1asmxファイルがあって、2Webメソッドが実装されているってことですか?
> そうだとすれば、JITコンパイルは2Webメソッドまとめて行われますよ。

そうなんでしたっけ?

少なくとも Windows Forms では JIT はメソッド単位で行われます。

ASP.NET もこれの応用なら、.aspx や .asmx への初回アクセスで .dll 作成、呼び出されたメソッドが順次 JIT されつつ実行、なのかと思ってました。

引用返信 編集キー/
■17283 / inTopicNo.7)  Re[3]: Webサービスのコンパイルタイミング
□投稿者/ ネタ好き (128回)-(2008/04/21(Mon) 17:39:44)
2008/04/21(Mon) 17:48:27 編集(投稿者)

列海王さんへ
もしかしたら、違うセッションと判断されているのかもしれませんね。
だから、メソッド2を呼び出した時点でインスタンスが新たに作られるのかも。
ためしにWebサービス内でアプリケーションの情報を出力しては如何でしょうか?
コンパイルについては、メソッド単位だと思います。
引用返信 編集キー/
■17284 / inTopicNo.8)  Re[4]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (5回)-(2008/04/21(Mon) 17:45:54)
No17283 (ネタ好き さん) に返信
> 2008/04/21(Mon) 17:40:08 編集(投稿者)
>
> 列海王さんへ
> もしかしたら、違うコネクションと判断されているのかもしれませんね。
> だから、メソッド2を呼び出した時点でインスタンスが新たに作られるのかも。
> ためしにWebサービス内でアプリケーションの情報を出力しては如何でしょうか?
> コンパイルについては、メソッド単位だと思います。
>

なるほど、新たにインスタンスが作られるのであればこの動作は
納得ですね。
(さらに、同一のメソッドを連続して呼び出す場合はコンパイルは
発生しないということですか、、)
大変恐縮ですが、アプリケーションの情報はどのようなものを
出力すればメソッド間の差異を効率よく発見できるのでしょうか。
お手数ですが、ご教授下さい。


引用返信 編集キー/
■17285 / inTopicNo.9)  Re[5]: Webサービスのコンパイルタイミング
□投稿者/ ネタ好き (129回)-(2008/04/21(Mon) 17:54:20)
2008/04/21(Mon) 18:06:17 編集(投稿者)
2008/04/21(Mon) 17:55:06 編集(投稿者)

烈海王 さんに返信
例えば、

public class Foo {
private static DateTime timeStamp;

[WebMethod]
public static void Foo1(-省略-) {
timeStamp = DateTime.Now;
-省略-
}

[WebMethod]
public static void Foo2(-省略-) {
Debug.Write(timeStamp.ToString())
}

}

ってな感じでどうでしょうか?
引用返信 編集キー/
■17295 / inTopicNo.10)  Re[6]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (7回)-(2008/04/21(Mon) 18:36:39)
下記のWebサービスを作成し、試してみました。
Set()とGet()で情報の共有が出来ていることを確認しました。
もし、メソッドごとにコンパイルが発生する場合、
Set()で設定した情報はリセットされるものと
考えてましたが、、、いかがでしょう。
さらに、現在の私の問題に近づけるため、
_xと_yを保持した静的クラスを別途設け、Set()とGet()で
参照するようにしたところ、これも同一のインスタンスを
参照できていました。

public class Service : System.Web.Services.WebService
{

public Service () { }

static int _x;
static int _y;

[WebMethod]
public void Set(int x, int y) {
_x = x;
_y = y;
}

[WebMethod]
public int Get()
{
return _x + _y;
}

}
引用返信 編集キー/
■17299 / inTopicNo.11)  Re[7]: Webサービスのコンパイルタイミング
□投稿者/ 渋木宏明(ひどり) (711回)-(2008/04/21(Mon) 20:06:15)
渋木宏明(ひどり) さんの Web サイト
> もし、メソッドごとにコンパイルが発生する場合、
> Set()で設定した情報はリセットされるものと
> 考えてましたが、、、いかがでしょう。

「コンパイル」つーのがどういう動作を指しているかによって異なります。

「.aspx や .asmx から .dll を生成する」のと「実行対象となったメソッドが JIT される」のはまったく別の動作です。

引用返信 編集キー/
■17301 / inTopicNo.12)  Re[8]: Webサービスのコンパイルタイミング
□投稿者/ なちゃ (120回)-(2008/04/21(Mon) 20:29:03)
小さなサイトで何秒もかかるのは、アプリが再起動してる場合が多いです。
※もちろん他の可能性もありますが

で、例えばbinディレクトリに書き込みしてないかとか、
そういうところの方が確認が要りそうです。

引用返信 編集キー/
■17302 / inTopicNo.13)  Re[9]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (9回)-(2008/04/21(Mon) 21:05:51)
No17301 (なちゃ さん) に返信
> 小さなサイトで何秒もかかるのは、アプリが再起動してる場合が多いです。
> ※もちろん他の可能性もありますが
>
> で、例えばbinディレクトリに書き込みしてないかとか、
> そういうところの方が確認が要りそうです。
>

  !!!

  今、衝撃が走りました。

  Webメソッド2ではbinディレクトリ配下を操作しています。
  まだ試していませんが、恐らくこれですね・・・。




引用返信 編集キー/
■17304 / inTopicNo.14)  Re[10]: Webサービスのコンパイルタイミング
□投稿者/ 烈海王 (11回)-(2008/04/21(Mon) 21:15:35)
今、確認しました。

なちゃ さんの忠告どおり、binディレクトリ内の情報更新によって
リコンパイルされていたことが原因です。
別のことに気を取られていました。
とてもお恥ずかしいです・・・。

皆様ご協力ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -