¿Cómo convierto una HttpRequest en un objeto HttpRequestBase?

77

Mi problema es el opuesto a esto: ¿Cómo convierto un HttpRequestBase en un objeto HttpRequest?

En mi aplicación ASP.NET MVC tengo un método utilizado por muchos controladores que reciben un HttpRequestBase como argumento.

Ahora tengo que llamar a ese método desde otro método, que no es una acción (es un interceptor nhibernado). En este segundo método, pude acceder a HttpContext.Current.Request, que es una HttpRequest y no puedo enviarla a HttpRequestBase (pensé que era posible debido al nombre ...).

¿Alguien sabe en qué relación están estas clases y cómo puedo resolver mi problema? Gracias.

Daniele Armanasco
fuente

Respuestas:

128

Querrás envolver tu HttpRequesten un HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

El HttpRequestWrapperhereda de HttpRequestBase.

Jamie Dixon
fuente
9
podría ser útilnew HttpRequestWrapper(HttpContext.Current.Request)
Yasser Shaikh
22

Esta es otra solución que no requiere crear una nueva instancia:

var httpRequestBase = myHttpRequest.RequestContext.HttpContext.Request;
S. Serpooshan
fuente
1

En mi aplicación, recibí llamadas de varios lugares diferentes que necesitaban acceso a HttpRequestBase. Creé este conjunto de métodos de extensión para obtener y convertir varios tipos Http diferentes en HttpRequestBase, luego usé HttpRequestBase como el tipo base para los métodos de interfaz y clase a través de la aplicación cuando necesitaba acceso a la solicitud.

public static class RequestExtensions
{
    public static HttpRequestBase GetHttpRequestBase(this HttpContext httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentException("Context is null.");
        }

        return httpContext.Request.ToHttpRequestBase();
    }

    public static HttpRequestBase GetHttpRequestBase(this HttpRequestMessage httpRequestMessage)
    {
        if (httpRequestMessage == null)
        {
            throw new ArgumentException("Request message is null.");
        }

        HttpContextWrapper context = null;
        if (httpRequestMessage.Properties.ContainsKey("MS_HttpContext"))
        {
            context = httpRequestMessage.Properties["MS_HttpContext"] as HttpContextWrapper;
        }
        if (context == null)
        {
            throw new ArgumentException("Context is null.");
        }

        return context.Request;
    }

    public static HttpRequestBase GetHttpRequestBase(this HttpApplication httpApplication)
    {
        if (httpApplication == null)
        {
            throw new ArgumentException("Application is null.");
        }

        return httpApplication.Request.ToHttpRequestBase();
    }

    public static HttpRequestBase ToHttpRequestBase(this HttpRequest httpRequest)
    {
        if (httpRequest == null)
        {
            throw new ArgumentException("Request is null.");
        }

        return new HttpRequestWrapper(httpRequest);
    }
}

Encontré varias respuestas SO que me ayudaron a construir estas extensiones:

jwatts1980
fuente
0

Encuentro útiles los siguientes métodos de extensión:

    public static HttpContextBase AsBase(this HttpContext context)
    {
        return new HttpContextWrapper(context);
    }

    public static HttpRequestBase AsBase(this HttpRequest context)
    {
        return new HttpRequestWrapper(context);
    }

Uso:

HttpContext.Current.AsBase()
HttpContext.Current.Request.AsBase()
rothschild86
fuente