21202


VisualStudio2008で作られたASP.NET Webアプリケーションがあります。  
『このWebアプリケーションに何らかのアクセスがあったらbreakする』のような事は可能でしょうか？

大量のaspxファイルがあり、その全てにbreakpointを貼るのは非現実的過ぎると思いまして...

* * *

VisualStudio 2008 + IIS Express  
.NET Framework 3.5


CC BY-SA 3.0
2016-01-22T09:40:23.600
21188
2016-01-22T23:43:48.527
2383
question
visual-studio asp.net
アクセスがあったらbreakしたい


Global.asaxファイルを追加し、Session_Startイベントにブレークポイントを貼りましょう。  
そうすれば、WebブラウザからWebアプリケーションにHTTPによる要求が出されたときに  
Session_Startイベントが走りますので、ご希望どおりのことができます。

■参考サイト  
[Global.asaxファイルを活用する](http://infotechfactory.biz/vb/vb2010asp/4/1.html)


CC BY-SA 3.0
2016-01-22T10:21:18.887
21189
2016-01-22T10:21:18.887
6040
21188
answer


> アクセスがあったらbreakしたい

は意図は理解できますが、しかし、曖昧な表現でもあります。より具体的に考えましょう。

> 大量のaspxファイルがあり、その全てにbreakpointを貼るのは非現実的過ぎる

aspxファイルということは

[code]

    public partial class _Default : System.Web.UI.Page {
    }
    
[/code]

というようなクラスが多数あり、ここでbreakしたいと解釈しました。まずbreakすべきはコンストラクターであり、しかし、派生クラスが多数あり現実的でない、とのこと。  
であれば親クラスである[Pageクラスのコンストラクター](https://msdn.microsoft.com/ja-
jp/library/system.web.ui.page.page\(v=vs.100\).aspx)でbreakすればいいだけです。

Visual Studioは既定で[方法 : マイ コードのみにステップ インする](https://msdn.microsoft.com/ja-
jp/library/h5e30exc\(v=vs.100\).aspx)によりクラスライブラリ内ではbreakしないように設定されているので、これを解除します。  
その上で[方法 : 関数ブレークポイントを設定する](https://msdn.microsoft.com/ja-
jp/library/15d1wtaf\(v=vs.100\).aspx)により`System.Web.UI.Page.Page`にブレークポイントを設定します。  
これで`Page`コンストラクターでbreakします。ソースコードは表示されないでしょうが意図通り停止してますのでそこから更に`F11ステップイン`をすれば派生クラスのコンストラクターへ進みます。


CC BY-SA 3.0
2016-01-22T21:08:26.653
21202
2016-01-22T21:08:26.653
4236
21188
answer


一般的に`Page`でないもの(asmxやashxやaxd)を含めた`IHttpHandler`へのアクセスが検知したいのであれば、Global.asax.csで`HttpApplication.BeginRequest`を監視するのが良いと思います。

[code]

    void Application_BeginRequest(object sender, EventArgs e)
    {
        // HttpContext.Current.Request等を参照する
    }
    
[/code]

ただし、このタイミングではセッション等が構成されていませんので、必要に応じて[後続のイベント](https://msdn.microsoft.com/ja-
jp/library/system.web.httpapplication.aspx)に変更してください。

また、通常Global.asaxを経由しない静的なファイル等でもアプリケーションイベントを発生させたい場合はWeb.configの`system.webServer`/`modules`セクションで`runAllManagedModulesForAllRequests`を設定する必要があります。

[code]

    <configuration>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
      </system.webServer>
    </configuration>
    
[/code]


CC BY-SA 3.0
2016-01-22T23:43:48.527
21204
2016-01-22T23:43:48.527
5750
21188
answer