- PR -

コンポーネントクラス内でセッションを利用するには?

投稿者投稿内容
とも
会議室デビュー日: 2005/01/25
投稿数: 4
投稿日時: 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は利用できないのでしょうか?
コンポーネントクラス内で定義した関数で、エラーが発生した場合の処理は
どのようにするべきでしょうか?
いのつち
ベテラン
会議室デビュー日: 2002/05/14
投稿数: 73
投稿日時: 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/24
投稿数: 22
投稿日時: 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/25
投稿数: 4
投稿日時: 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/24
投稿数: 22
投稿日時: 2005-01-26 14:05
引用:

そこで、画面ページのPage_Errorイベントでセッションにエラー情報を
格納して、err.aspxで参照しようと思ったのですが、アプリケーションエラーは
発生しないものの、セッション情報もなくなっているようで、何も表示されません。


まず、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/24
投稿数: 22
投稿日時: 2005-01-26 14:15
おふぃすこまです。ちょっと書き漏れました。
引用:

server.transferは、ページの移動と思っていたのですが違うのでしょうか?


プログラミング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)
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-01-26 14:33
引用:

おふぃすこまさんの書き込み (2005-01-26 14:15) より:
おふぃすこまです。ちょっと書き漏れました。
引用:

server.transferは、ページの移動と思っていたのですが違うのでしょうか?


プログラミングASP.NET ASP.NETにおけるページの遷移
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet16/aspnet16_01.html
ここを見れば、分かると思います。
ま、ページ移動には変わりないのですが



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/25
投稿数: 4
投稿日時: 2005-01-26 16:00
ともです。
おふぃすこまさん、NAL-6295さん、ありがとうございます。
Transferっていろんなことができるんですね。
すごく勉強になりました。

おふぃすこまさん、また質問があります。
何度もごめんなさい。
Sub Application_Error(Sender As Object, E As EventArgs)
で、例外をまとめて管理できることがわかりました。
実際にコードを書いてみて、エラーが発生した関数名まで取得できました。

今までエラー処理は各関数内で行うべきものだと思っていました。
ASP.NETでは、各関数で個別に例外を処理しないで、
アプリケーションでまとめてひとつで処理するのが一般的なのでしょうか?
各関数内で個別に例外処理を記述するのは例えば、開いていたファイルを閉じるとか、
DB接続を閉じるとかする必要がある場合だけですか?

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