Ответ 1
Вы захотите обернуть свой HttpRequest
в HttpRequestWrapper
:
var wrapper = new HttpRequestWrapper(httpRequest);
HttpRequestWrapper
наследуется от HttpRequestBase
.
Моя проблема противоположна этому: Как преобразовать HttpRequestBase в объект HttpRequest?
В моем приложении ASP.NET MVC у меня есть метод, используемый многими контроллерами, которые получают HttpRequestBase в качестве аргумента.
Теперь я должен вызвать этот метод из другого метода, который не является действием (это перехватчик nhibernate). В этом втором методе я мог получить доступ к HttpContext.Current.Request, то есть HttpRequest, и я не могу передать его в HttpRequestBase (я думал, что это возможно из-за именования...).
Кто-нибудь знает, в каких отношениях эти классы и как я могу решить свою проблему? Спасибо.
Вы захотите обернуть свой HttpRequest
в HttpRequestWrapper
:
var wrapper = new HttpRequestWrapper(httpRequest);
HttpRequestWrapper
наследуется от HttpRequestBase
.
Альтернативное решение, которое не требует создания нового экземпляра:
var httpRequestBase = httpRequest.RequestContext.HttpContext.Request;
Я тестировал это в MVC 5.
Я считаю полезными следующие методы расширения:
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()
В моем приложении мне звонили из нескольких разных мест, которым требовался доступ к 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-ответов, которые помогли мне построить эти расширения: