- - PR -
コンポーネントクラス内でセッションを利用するには?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-26 00:32
はじめまして。
初めてASP.NETを使用して開発することになりました。 エラーが発生した場合、その情報をセッションでエラー情報表示画面に渡すようにしたいと思っています。 渡す情報はエラー番号、エラー内容、ファイル名、関数名です。 aspxファイル内の関数では正常に動作します。 ところがコンポーネントクラス内に作成した関数ではsessionとserver.transferが利用できません。 'cls_a.vb Public Class cls_a Inherits System.Componentmodel.Component Public Function fnc_b On Error goto Err_Syori err.raise(1) Exit Function Err_Syori: session("ErrNo")=err.no session("ErrDesc")=err.description session("ErrPg")="cls_a.vb" session("ErrFunc")="fnc_b" server.transfer("http://localhost/err.aspx") End Function End Class いずれも「名前'session'は宣言されていません」とエラーになります。 コンポーネントクラス内ではsessionやserverは利用できないのでしょうか? コンポーネントクラス内で定義した関数で、エラーが発生した場合の処理は どのようにするべきでしょうか? | ||||||||
|
投稿日時: 2005-01-26 09:28
System.Web.HttpContext の Currentプロパティで現在のHttpContextを取得して
Serverプロパティ、Sessionプロパティを取得します。 HttpContext.Current.Server HttpContext.Current.Session ASP.NET上で動作していない場合、 HttpContext.Currentはnullになるので チェックも必要です。 | ||||||||
|
投稿日時: 2005-01-26 09:32
こんにちは。
直接の回答では無いのですが、いくつかご指摘を。 1.ASP.NETではレガシーASPで使用していたErrオブジェクトはサポートされてないと思います。 もし同じ事をしようとするのであれば、 Dim errInformation As Exception = Server.GetLastError session("ErrDesc") = errInformation.Message 2.On Error goto 〜 は一応VB.NETでも使えますが、 Try 〜 Catch でエラーを取得した方がいいですよ。 3.各処理毎にエラーページへ遷移するようなプログラム設計ではなく、 web.configでエラーページを指定しておくような設計がいいと思います。 (詳細は自分で調べてみて下さい。ヒントは<customErrors>タグ) ちなみに、server.transfer は、きちんと理解した上で使ってますか? | ||||||||
|
投稿日時: 2005-01-26 10:57
いのつちさん、おふぃすこまさん、ありがとうございます。
いのつちさん 教えていただいたコードでコンポーネントクラス内でもセッションを使用できました。 丁寧にありがとうございます。 おふぃすこまさん server.transferは、ページの移動と思っていたのですが違うのでしょうか? 3.の<customErrors>タグを使用して、err.aspxに移動するようにしてみました。 <customErrors defaultRedirect="err.aspx" mode="On" /> このページのPage_Loadで、エラーの詳細を表示しようと思い、 Dim errInformation As Exception = Server.GetLastError Response.write (errInformation.Message ) をしてみたのですが、「現在のカスタムエラー設定では詳細を表示できません」 というアプリケーションエラーが発生します。 エラー情報を表示しなければerr.aspxは表示されます。 そこで、画面ページのPage_Errorイベントでセッションにエラー情報を 格納して、err.aspxで参照しようと思ったのですが、アプリケーションエラーは 発生しないものの、セッション情報もなくなっているようで、何も表示されません。 syori.aspx内 Sub Page_Error Dim errInformation As Exception = Server.GetLastError Session("ErrMsg")=errInformation.Message End Sub err.aspx内 Sub Page_Load Response.write (Session("ErrMsg") ) End Sub エラー画面でエラー情報の詳細(エラー番号、内容、エラー発生関数名、エラー発生ページ)を表示するにはどのようにするべきでしょうか? | ||||||||
|
投稿日時: 2005-01-26 14:05
まず、err.aspxに遷移している理由ですが、本当に例外エラーが発生しているのでしょうか? <customErrors>を mode="On" にしていると、コンパイルエラーでもerr.aspxに遷移してしまいます。 その際は当然ですが Page_Error() は行いませんし、セッションにも何も格納されません。 それと、Page_Error()にエラー処理を行うとやっぱり各ページごとに設定が必要になりますよね? ASP.NETには、プロジェクトごとにエラー処理を行う事も出来ます。 Global.asaxの Sub Application_Error(Sender As Object, E As EventArgs) に記述する方法です。 詳細は、 [MSDN].NET における例外管理 http://www.microsoft.com/japan/msdn/net/bda/exceptdotnet.asp Microsoft ASP.NET クイック スタート チュートリアル[エラー処理] http://ja.gotdotnet.com/quickstart/aspplus/doc/handlingerrs.aspx 後は、この会議室でスレッドを検索してみるとか。 | ||||||||
|
投稿日時: 2005-01-26 14:15
おふぃすこまです。ちょっと書き漏れました。
プログラミングASP.NET ASP.NETにおけるページの遷移 http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet16/aspnet16_01.html ここを見れば、分かると思います。 ま、ページ移動には変わりないのですが
Dim errInformation As Exception = Server.GetLastError.InnerException session(ErrMsg) = errInformation.ToString() とする事で、かなり詳細な部分まで表示されます。 (最初からこれを提示しろって感じですよね。すいませんm(__)m) | ||||||||
|
投稿日時: 2005-01-26 14:33
Transferの説明として上のURLのみだと、不充分です。 ASP.NETの中身的にどうなのかが記述されていないからです。 ですから、一度 .NETエンタープライズWebアプリケーション開発技術大全 Vol.3 http://www.microsoft.com/japan/info/press/JPN_ViewMsPress.asp?Book_id=968&list_id=1 の第3章あたりを一読される事をお薦めします。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||||||
|
投稿日時: 2005-01-26 16:00
ともです。
おふぃすこまさん、NAL-6295さん、ありがとうございます。 Transferっていろんなことができるんですね。 すごく勉強になりました。 おふぃすこまさん、また質問があります。 何度もごめんなさい。 Sub Application_Error(Sender As Object, E As EventArgs) で、例外をまとめて管理できることがわかりました。 実際にコードを書いてみて、エラーが発生した関数名まで取得できました。 今までエラー処理は各関数内で行うべきものだと思っていました。 ASP.NETでは、各関数で個別に例外を処理しないで、 アプリケーションでまとめてひとつで処理するのが一般的なのでしょうか? 各関数内で個別に例外処理を記述するのは例えば、開いていたファイルを閉じるとか、 DB接続を閉じるとかする必要がある場合だけですか? |