Как преобразовать HttpRequest в объект HttpRequestBase?

Моя проблема противоположна этому:  Как преобразовать HttpRequestBase в объект HttpRequest?

В моем приложении ASP.NET MVC у меня есть метод, используемый многими контроллерами, которые получают HttpRequestBase в качестве аргумента.

Теперь я должен вызвать этот метод из другого метода, который не является действием (это перехватчик nhibernate). В этом втором методе я мог получить доступ к HttpContext.Current.Request, то есть HttpRequest, и я не могу передать его в HttpRequestBase (я думал, что это возможно из-за именования...).

Кто-нибудь знает, в каких отношениях эти классы и как я могу решить свою проблему? Спасибо.

Ответ 1

Вы захотите обернуть свой HttpRequest в HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

HttpRequestWrapper наследуется от HttpRequestBase.

Ответ 2

Альтернативное решение, которое не требует создания нового экземпляра:

var httpRequestBase = httpRequest.RequestContext.HttpContext.Request;

Я тестировал это в MVC 5.

Ответ 3

Я считаю полезными следующие методы расширения:

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

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

Использование:

HttpContext.Current.AsBase()
HttpContext.Current.Request.AsBase()

Ответ 4

В моем приложении мне звонили из нескольких разных мест, которым требовался доступ к HttpRequestBase. Я создал этот набор методов расширения для получения и преобразования нескольких различных типов Http в HttpRequestBase, а затем использовал HttpRequestBase в качестве базового типа для методов интерфейса и класса через приложение, когда мне был необходим доступ к запросу.

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

Я наткнулся на несколько SO-ответов, которые помогли мне построить эти расширения: