Как обнаружить приложение MVC в HttpModule
Я пишу HttpModule. Я пытаюсь выяснить, как обнаружить, что запрос к приложению MVC.
Я подключен к некоторым из обработчиков, как это.
public void Init(HttpApplication httpApp)
{
httpApp.PreRequestHandlerExecute += PreRequestHandlerExecute;
httpApp.PreSendRequestHeaders += PreSendRequestHeaders;
httpApp.PostRequestHandlerExecute += PostRequestHandlerExecute;
}
Мой PreRequestHandlerExecute нуждается в этом условном.
public void PreRequestHandlerExecute(object sender, EventArgs e)
{
if isMvc(HttpContext.Current))
{
doSomethingSpecificToMvc()
}
isMvc () выглядит следующим образом, полагаясь только на отсутствие расширения файла для обнаружения запроса MVC (который является хромым).
private static bool isMvc(HttpContext ctx)
{
bool retVal = false;
if (string.IsNullOrEmpty(VirtualPathUtility.GetExtension(ctx.Request.ServerVariables["PATH_INFO"])))
{
retVal = true;
}
return retVal;
}
Что может быть лучше, чтобы определить, что запрос к приложению MVC?
3 ответа
Лучше всего было бы посмотреть на заголовок HTTP и посмотреть, есть ли запись, похожая на эту.
X-AspNetMvc-версия 3.0
Вот обновленная версия isMvc, которая может работать для того, что вы делаете.
private static bool isMvc(HttpContext ctx)
{
bool retVal = false;
string []header = ctx.Request.Headers.AllKeys;
if (header.Contains("X-AspNetMvc"))
{
retVal = true;
}
return retVal;
}
Я обнаружил это. Если обработчик контекста был заполнен, это работает.
private static bool isMvc(HttpContext ctx)
{
bool retVal = false;
if (ctx.Handler != null && ctx.Handler.ToString() == "System.Web.Mvc.MvcHandler")
{
retVal = true;
}
return retVal;
}
Вы можете определить, является ли конечная точка приложением mvc asp.net, вызвав конечную точку и проверив X-AspNetMvc-Version в ответе. Не требуется, чтобы этот заголовок был в ответе, он по умолчанию помещается туда платформой. Вам нужно будет найти такие хаки, потому что у каждого фреймворка будет своя собственная система маршрутизации и уникальные особенности.