How do I convert an HttpRequest into an HttpReques

2019-03-09 19:15发布

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.

4条回答
神经病院院长
2楼-- · 2019-03-09 19:37

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:

查看更多
手持菜刀,她持情操
3楼-- · 2019-03-09 19:39

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

var wrapper = new HttpRequestWrapper(httpRequest);

The HttpRequestWrapper inherits from HttpRequestBase.

查看更多
我欲成王,谁敢阻挡
4楼-- · 2019-03-09 19:50

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()
查看更多
Summer. ? 凉城
5楼-- · 2019-03-09 19:52

Alternative solution which does not require to create a new instance:

var httpRequestBase = httpRequest.RequestContext.HttpContext.Request;

I have tested this in MVC 5.

查看更多
登录 后发表回答