- PR -

[ASP.NET]Requestをクラスの中で使うには

1
投稿者投稿内容
ドコモダケ
会議室デビュー日: 2006/10/08
投稿数: 11
投稿日時: 2006-10-15 15:29
お世話になっております。

現在、VS2003を使ったWebシステムの構築を行っております。
その中で、「WEBにアクセスしてきた人のログをとろう」と考え
クライアントのIPアドレスを取得して、日付と共にファイルに書き出そうと
処理を書いたのまではうまくいったのですが
「いろんなページで使うから、書き出し処理をクラスにしよう」
と考えました。

が、クラスに切り出しただけではうまくいかず、難航しています。
とりあえず何がだめなのかを一行ずつ分析していった結果
「Request.UserHostAddress」が値を返していないようなのです。

単純な部分だけ書きます

↓これはうまくいきました
[WebForm1.aspx.vb]
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  
  '--IPアドレスを取得し表示します。
  Response.Write(Request.UserHostAddress)

End Sub

これを下記のように変えました
[class1.vb]
Public Class Class1
 Inherits System.Web.UI.Page
 
 Public Function viewip()
 
  Return Request.UserHostAddress()

 End Function

End Class


[WebForm1.aspx.vb]
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  
  dim o_class as Class1
  dim s_ip as String = o_class.viewip

  '--IPアドレスを取得し表示します。
  Response.Write(s_ip)

End Sub

ビルドはエラーにならないのですが、実行時
「オブジェクト参照がオブジェクト インスタンスに設定されていません」
と表示されてしまいます。

申し訳ございませんが、よろしくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-10-15 15:48
System.Web.HttpContext.Current に現在の要求に対するオブジェクトが格納されています。
http://msdn2.microsoft.com/ja-jp/library/system.web.httpcontext.current.aspx
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-10-15 15:54
引用:

ドコモダケさんの書き込み (2006-10-15 15:29) より:
ビルドはエラーにならないのですが、実行時
「オブジェクト参照がオブジェクト インスタンスに設定されていません」
と表示されてしまいます。


なぜかわからんってこと?
インスタンスが何たるかがわかっていないみたい。
Requestってのがどのメンバなのかもわかっていないみたい。
Class1でRequestと書くとどのRequestを表すのかわかっていないみたい。
Class1が継承されているからこそReq(略

以上がちょっと気になったところ。
いい機会だから勉強した方がいいんじゃねーかなと思う。
ドコモダケ
会議室デビュー日: 2006/10/08
投稿数: 11
投稿日時: 2006-10-15 19:58
かるあ様、ぶさいくろう様

教えていただいてありがとうございました。
おかげさまでうまくいきました。

[class1.vb]
Public Class Class1

  Public Function viewip(ByVal o_req As System.Web.HttpRequest)

    Return o_req.UserHostAddress

  End Function

End Class

[WebForm1.aspx.vb]
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  '--Class1のインスタンスを生成
  Dim o_class As New Class1
 
  '--IPアドレスを取得し表示
  Dim s_ip As String = o_class.viewip(System.Web.HttpContext.Current.Request)
  Response.Write(s_ip)


End Sub

ぶさいくろう様

おっしゃるとおりです。まだ駆け出しでオブジェクト指向の意味すらよくわかって
いない状態ですが、これから学んでいきたいと思っております。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-10-15 20:32
余計なお世話ですけど、System.Web.HttpContext.Current 使うんだったらこのような方がいいですね。
コード:
[class1.vb] 
Public Class Class1 
  Public Function viewip() 
    Return System.Web.HttpContext.Current.Request.UserHostAddress 
  End Function 
End Class 

[WebForm1.aspx.vb] 
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
  '--Class1のインスタンスを生成 
  Dim o_class As New Class1 
  
  '--IPアドレスを取得し表示 
  Dim s_ip As String = o_class.viewip() 
  Response.Write(s_ip) 
End Sub 



IPアドレスを取得するだけの関数だったら意味ないなぁと思うんですが、実際はいろいろ処理が入るんですよね。
_________________
囚人のジレンマな日々
1

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