2012-05-03 21 views
16

Me gustaría mover el siguiente fragmento de código de un archivo C# aspx.cs a un archivo class.cs autónomo.¿Por qué el nombre 'Solicitud' no existe cuando se escribe en un archivo class.cs?

string getIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (String.IsNullOrEmpty(getIP)) getIP = Request.ServerVariables["REMOTE_ADDR"]; 

Esta pieza de código utilizado para residir en el Page_Load de un fichero aspx.cs funcionaba bien, pero genera un error en el archivo de clase.

La 'Solicitud' no necesita 'usar' cuando está en un archivo aspx.cs, y no ofrece ninguna en este contexto.

¿Cómo resuelvo este problema?

Respuesta

41

Request es una propiedad de la clase de página. Por lo tanto, no puede acceder desde una clase "independiente".

Sin embargo, se puede obtener el HttpRequest de todos modos a través de HttpContext.Current

var request = HttpContext.Current.Request; 

Tenga en cuenta que esto funciona incluso en un método estático. Pero solo si estás en un HttpContext (por lo tanto, no en una aplicación de Winforms). Por lo que debe asegurarse de que no es null:

if (HttpContext.Current != null) 
{ 
    var request = HttpContext.Current.Request; 
} 

Editar: Por supuesto, también puede pasar el pedido como parámetro al método que lo consume. Esta es una buena práctica ya que no funciona sin. De esta forma, cada cliente sabría inmediatamente si esta clase/método funciona o no.

+3

+1, pero en estos casos prefiero que el método que aloja el código requiera un HttpContext como argumento de parámetro (o construcción similar). Me gustaría ver algo en la interfaz pública para el tipo en que este código espera un contexto web. –

+1

De acuerdo con Joel – MikeTWebb

+0

Yo también. Editado mi respuesta. –

1

La razón por la que no funciona es porque no puede acceder a las variables del servidor en un proyecto de biblioteca de clase.

Debe evitar intentar hacer que esto actúe como una clase web y, en cambio, pasar la información que necesita al objeto de clase a través de un parámetro normal.

Cuestiones relacionadas