Как обнаружить приложение 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 в ответе. Не требуется, чтобы этот заголовок был в ответе, он по умолчанию помещается туда платформой. Вам нужно будет найти такие хаки, потому что у каждого фреймворка будет своя собственная система маршрутизации и уникальные особенности.

Другие вопросы по тегам