9 ответов:
Это ваш метод, так что вы можете переписать его, чтобы взять
HttpRequestBase? Если нет, то вы всегда можете получить текущийHttpRequestСHttpContext.Current.HttpRequestчтобы пройти дальше. Тем не менее, я часто обертываю доступ к HttpContext внутри класса, как указано вASP.NET: удаление системы.Веб-Зависимости для лучшей поддержки модульного тестирования.
вы всегда должны использовать HttpRequestBase и HttpResponseBase в своем приложении как приложение к конкретным версиям, которые невозможно проверить (без typemock или какой-либо другой магии).
просто использовать HttpRequestWrapper класс для преобразования, как показано ниже.
var httpRequestBase = new HttpRequestWrapper(Context.Request);
вы можете просто использовать
System.Web.HttpContext.Current.Requestключ здесь заключается в том, что вам нужно полное пространство имен, чтобы добраться до "правильного" HttpContext.
Я знаю, что прошло 4 года с тех пор, как этот вопрос был задан, но если это поможет кому-то, то вот вам!
(Edit: я вижу, что Кевин Хакансон уже дал это answer...so надеюсь, мой ответ поможет тем людям, которые просто читают ответы, а не комментарии.):)
чтобы получить HttpRequest в ASP.NET MVC4 .NET 4.5, вы можете сделать следующее:
this.HttpContext.ApplicationInstance.Context.Request
обычно, когда вам нужно получить доступ к
HttpContextсвойство в действии контроллера, есть что-то, что вы можете сделать лучше дизайн мудрый.например, если вам нужно получить доступ к текущему пользователю, дать свой способ действия параметр типа
IPrincipal, который вы заполняете сAttributeи глумиться, как вы хотите при тестировании. Для небольшого примера о том, как, см. этот блог, а конкретно пункт 7.
нет способа конвертировать между этими типами.
У нас был похожий случай. Мы переписали наши методы классов / веб-служб так, чтобы они использовали HttpContextBase, HttpApplicationStateBase, HttpServerUtilityBase, HttpSessionStateBase... вместо типов close name без суффикса" Base " (HttpContext, ... HttpSessionState). Они намного легче справляются с самодельным издевательством.
Мне жаль что ты не смог сделать это.
Это Ан ASP.Net MVC 3.0 AsyncController, который принимает запросы, преобразует входящий объект HttpRequestBase MVC в систему.Сеть.класс HttpWebRequest. Затем он отправляет запрос асинхронно. Когда ответ возвращается, он преобразует систему.Сеть.HttpWebResponse возвращается в объект MVC HttpResponseBase, который может быть возвращен через контроллер MVC.
чтобы ответить на этот вопрос явно, я думаю, вас будет интересовать только функция BuildWebRequest (). Однако демонстрирует, как перемещаться по всему конвейеру - преобразование из BaseRequest > запрос, а затем ответ > 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и так всегда было!--5--> объект для использования при необходимости.здесь в классе Helper
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)
Comments