Як перетворити HttpRequest в об'єкт HttpRequestBase?


77

Моя проблема протилежна цьому: Як перетворити HttpRequestBase в об'єкт HttpRequest?

У моїй програмі ASP.NET MVC у мене є метод, що використовується багатьма контролерами, які отримують HttpRequestBase як аргумент.

Тепер я повинен викликати цей метод з іншого методу, який не є дією (це перехоплювач nhibernate). У цьому другому методі я міг отримати доступ до HttpContext.Current.Request, тобто HttpRequest, і я не можу передати його до HttpRequestBase (я думав, що це можливо через іменування ...).

Хтось знає, у яких стосунках знаходяться ці класи і як я можу вирішити свою проблему? Дякую.

Відповіді:


128

Ви хочете , щоб обернути HttpRequestв HttpRequestWrapper:

var wrapper = new HttpRequestWrapper(httpRequest);

В HttpRequestWrapperуспадковується від HttpRequestBase.


9
може бути кориснимnew HttpRequestWrapper(HttpContext.Current.Request)
Ясер Шейх

22

Це ще одне рішення, яке не вимагає створення нового екземпляра:

var httpRequestBase = myHttpRequest.RequestContext.HttpContext.Request;

1

У моїй заявці мені дзвонили з кількох різних місць, які потребували доступу до 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-відповідей, які допомогли мені створити ці розширення:


0

Я вважаю такі методи розширення корисними:

    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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.