78

My problem is the opposite of this: How do I convert an HttpRequestBase into an HttpRequest object?

In my ASP.NET MVC application I have a method used by many controllers that receive an HttpRequestBase as argument.

Now I have to call that method from another method, that is not an action (it's an nhibernate interceptor). In this second method I could access HttpContext.Current.Request, that is a HttpRequest and I cannot cast it to HttpRequestBase (I thought it was possibile due to the naming ...).

Does someone know in what relationship are this classes and how can I solve my problem? Thank you.

Community
  • 1
  • 1
Daniele Armanasco
  • 7,030
  • 9
  • 41
  • 53

4 Answers4

134

You'll want to wrap your HttpRequest in a HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

The HttpRequestWrapper inherits from HttpRequestBase.

Jamie Dixon
  • 51,570
  • 19
  • 123
  • 158
27

This is an another solution which does not require to create a new instance:

var httpRequestBase = myHttpRequest.RequestContext.HttpContext.Request;
S.Serpooshan
  • 6,918
  • 3
  • 31
  • 58
2

In my application I had calls coming from several different places that needed access to the HttpRequestBase. I created this set of extension methods to get and convert from several different Http types into a HttpRequestBase, then used HttpRequestBase as the base type for interface and class methods through the application when I needed access to the request.

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);
    }
}

I came across several SO answers that helped me build these extensions:

jwatts1980
  • 6,943
  • 2
  • 25
  • 41
0

I find the following extension methods useful:

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

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

Usage:

HttpContext.Current.AsBase()
HttpContext.Current.Request.AsBase()
rothschild86
  • 1,257
  • 14
  • 19