внутри моего контроллера ASP.NET MVC у меня есть метод, для которого требуется HttpRequest
объект. Все, к чему у меня есть доступ, - это HttpRequestBase
объект.
Есть ли способ как-то преобразовать это?
Что я могу / должен делать ??
asp.net-mvc
httprequest
Pure.Krome
источник
источник
Ответы:
Это твой метод, чтоб можно было переписать
HttpRequestBase
? Если нет, то вы всегда можете получить токHttpRequest
отHttpContext.Current.HttpRequest
пройти дальше. Однако я часто оборачиваю доступ к HttpContext внутри класса, подобного упомянутому в ASP.NET: Удаление зависимостей System.Web для лучшей поддержки модульного тестирования.источник
Вы всегда должны использовать HttpRequestBase и HttpResponseBase в своем приложении в отличие от конкретных версий, которые невозможно проверить (без typemock или какой-либо другой магии).
Просто используйте класс HttpRequestWrapper для преобразования, как показано ниже.
var httpRequestBase = new HttpRequestWrapper(Context.Request);
источник
HttpRequestBase
иHttpResponseBase
, такжеHttpContextBase
. :)Вы можете просто использовать
System.Web.HttpContext.Current.Request
Ключевым моментом здесь является то, что вам нужно полное пространство имен, чтобы добраться до «правильного» HttpContext.
Я знаю, что прошло уже 4 года с тех пор, как этот вопрос был задан, но если это кому-то поможет, то готово!
(Изменить: я вижу, что Кевин Хакансон уже дал этот ответ ... так что, надеюсь, мой ответ поможет тем людям, которые просто читают ответы, а не комментарии.) :)
источник
Попробуйте использовать / создать HttpRequestWrapper с помощью HttpRequestBase.
источник
Чтобы получить HttpRequest в ASP.NET MVC4 .NET 4.5, вы можете сделать следующее:
this.HttpContext.ApplicationInstance.Context.Request
источник
Обычно, когда вам нужно получить доступ к
HttpContext
свойству в действии контроллера, есть кое-что, что вы можете сделать лучше с точки зрения дизайна.Например, если вам нужно получить доступ к текущему пользователю, дайте вашему методу действия параметр типа
IPrincipal
, который вы заполняетеAttribute
и имитируете по своему усмотрению при тестировании. Небольшой пример того, как это сделать, можно найти в этом сообщении в блоге , особенно в пункте 7.источник
Нет возможности конвертировать между этими типами.
У нас был похожий случай. Мы переписали наши методы классов / веб-сервисов, чтобы они использовали HttpContextBase, HttpApplicationStateBase, HttpServerUtilityBase, HttpSessionStateBase ... вместо типов близких имен без суффикса «Base» (HttpContext, ... HttpSessionState). С ними намного проще справиться самодельным издевательством.
Мне жаль, что ты не смог этого сделать.
источник
Это AsyncController ASP.Net MVC 3.0, который принимает запросы и преобразует входящий объект HttpRequestBase MVC в System.Web.HttpWebRequest. Затем он отправляет запрос асинхронно. Когда ответ возвращается, он преобразует System.Web.HttpWebResponse обратно в объект MVC HttpResponseBase, который может быть возвращен через контроллер MVC.
Чтобы ответить на этот вопрос явно, я думаю, вас будет интересовать только функция BuildWebRequest (). Однако он демонстрирует, как перемещаться по всему конвейеру - преобразование из BaseRequest> Request, а затем Response> BaseResponse. Я подумал, что будет полезно поделиться обоими.
С помощью этих классов у вас может быть сервер MVC, который действует как веб-прокси.
Надеюсь это поможет!
Контроллер:
[HandleError] public class MyProxy : AsyncController { [HttpGet] public void RedirectAsync() { AsyncManager.OutstandingOperations.Increment(); var hubBroker = new RequestBroker(); hubBroker.BrokerCompleted += (sender, e) => { this.AsyncManager.Parameters["brokered"] = e.Response; this.AsyncManager.OutstandingOperations.Decrement(); }; hubBroker.BrokerAsync(this.Request, redirectTo); } public ActionResult RedirectCompleted(HttpWebResponse brokered) { RequestBroker.BuildControllerResponse(this.Response, brokered); return new HttpStatusCodeResult(Response.StatusCode); } }
Это прокси-класс, который выполняет тяжелую работу:
namespace MyProxy { /// <summary> /// Asynchronous operation to proxy or "broker" a request via MVC /// </summary> internal class RequestBroker { /* * HttpWebRequest is a little protective, and if we do a straight copy of header information we will get ArgumentException for a set of 'restricted' * headers which either can't be set or need to be set on other interfaces. This is a complete list of restricted headers. */ private static readonly string[] RestrictedHeaders = new string[] { "Accept", "Connection", "Content-Length", "Content-Type", "Date", "Expect", "Host", "If-Modified-Since", "Range", "Referer", "Transfer-Encoding", "User-Agent", "Proxy-Connection" }; internal class BrokerEventArgs : EventArgs { public DateTime StartTime { get; set; } public HttpWebResponse Response { get; set; } } public delegate void BrokerEventHandler(object sender, BrokerEventArgs e); public event BrokerEventHandler BrokerCompleted; public void BrokerAsync(HttpRequestBase requestToBroker, string redirectToUrl) { var httpRequest = BuildWebRequest(requestToBroker, redirectToUrl); var brokerTask = new Task(() => this.DoBroker(httpRequest)); brokerTask.Start(); } private void DoBroker(HttpWebRequest requestToBroker) { var startTime = DateTime.UtcNow; HttpWebResponse response; try { response = requestToBroker.GetResponse() as HttpWebResponse; } catch (WebException e) { Trace.TraceError("Broker Fail: " + e.ToString()); response = e.Response as HttpWebResponse; } var args = new BrokerEventArgs() { StartTime = startTime, Response = response, }; this.BrokerCompleted(this, args); } public static void BuildControllerResponse(HttpResponseBase httpResponseBase, HttpWebResponse brokeredResponse) { if (brokeredResponse == null) { PerfCounters.ErrorCounter.Increment(); throw new GriddleException("Failed to broker a response. Refer to logs for details."); } httpResponseBase.Charset = brokeredResponse.CharacterSet; httpResponseBase.ContentType = brokeredResponse.ContentType; foreach (Cookie cookie in brokeredResponse.Cookies) { httpResponseBase.Cookies.Add(CookieToHttpCookie(cookie)); } foreach (var header in brokeredResponse.Headers.AllKeys .Where(k => !k.Equals("Transfer-Encoding", StringComparison.InvariantCultureIgnoreCase))) { httpResponseBase.Headers.Add(header, brokeredResponse.Headers[header]); } httpResponseBase.StatusCode = (int)brokeredResponse.StatusCode; httpResponseBase.StatusDescription = brokeredResponse.StatusDescription; BridgeAndCloseStreams(brokeredResponse.GetResponseStream(), httpResponseBase.OutputStream); } private static HttpWebRequest BuildWebRequest(HttpRequestBase requestToBroker, string redirectToUrl) { var httpRequest = (HttpWebRequest)WebRequest.Create(redirectToUrl); if (requestToBroker.Headers != null) { foreach (var header in requestToBroker.Headers.AllKeys) { if (RestrictedHeaders.Any(h => header.Equals(h, StringComparison.InvariantCultureIgnoreCase))) { continue; } httpRequest.Headers.Add(header, requestToBroker.Headers[header]); } } httpRequest.Accept = string.Join(",", requestToBroker.AcceptTypes); httpRequest.ContentType = requestToBroker.ContentType; httpRequest.Method = requestToBroker.HttpMethod; if (requestToBroker.UrlReferrer != null) { httpRequest.Referer = requestToBroker.UrlReferrer.AbsoluteUri; } httpRequest.UserAgent = requestToBroker.UserAgent; /* This is a performance change which I like. * If this is not explicitly set to null, the CLR will do a registry hit for each request to use the default proxy. */ httpRequest.Proxy = null; if (requestToBroker.HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase)) { BridgeAndCloseStreams(requestToBroker.InputStream, httpRequest.GetRequestStream()); } return httpRequest; } /// <summary> /// Convert System.Net.Cookie into System.Web.HttpCookie /// </summary> private static HttpCookie CookieToHttpCookie(Cookie cookie) { HttpCookie httpCookie = new HttpCookie(cookie.Name); foreach (string value in cookie.Value.Split('&')) { string[] val = value.Split('='); httpCookie.Values.Add(val[0], val[1]); } httpCookie.Domain = cookie.Domain; httpCookie.Expires = cookie.Expires; httpCookie.HttpOnly = cookie.HttpOnly; httpCookie.Path = cookie.Path; httpCookie.Secure = cookie.Secure; return httpCookie; } /// <summary> /// Reads from stream into the to stream /// </summary> private static void BridgeAndCloseStreams(Stream from, Stream to) { try { int read; do { read = from.ReadByte(); if (read != -1) { to.WriteByte((byte)read); } } while (read != -1); } finally { from.Close(); to.Close(); } } } }
источник
Это сработало, как сказал Кевин.
Я использую статический метод для извлечения
HttpContext.Current.Request
, и поэтому всегда имеюHttpRequest
объект для использования при необходимости.Здесь, в классе помощника
public static HttpRequest GetRequest() { return HttpContext.Current.Request; }
Здесь в контроллере
if (AcessoModel.UsuarioLogado(Helper.GetRequest()))
Здесь в представлении
bool bUserLogado = ProjectNamespace.Models.AcessoModel.UsuarioLogado( ProjectNamespace.Models.Helper.GetRequest() ); if (bUserLogado == false) { Response.Redirect("/"); }
Мой метод UsuarioLogado
public static bool UsuarioLogado(HttpRequest Request)
источник