Перенаправление ASP.NET не работает с неверным URL-адресом с блоком приложения UIProcess - ищите идеи архитектуры перенаправления? - PullRequest
0 голосов
/ 10 ноября 2011

В моем файле global.asax.vb у меня есть код для перезаписи URL, если в URL есть префикс.Мы вводим новый контекст в нашем приложении.Так что каждая страница будет либо из контекста волос, либо слюны.

Прежде чем код (стек) ASP.NET даже достигнет этого глобального кода, он вызывает блок приложения, называемый UIProcess.Это код, который Microsoft написала много лет назад и больше не поддерживается.Блок UIP имитирует MVC, и вы храните все представления, навигацию и детали контроллера в файле web.config.Блок UIP выполняет перенаправление, как показано ниже.Обратите внимание, что у них была известная ошибка, которая никогда не была исправлена ​​(закомментирована), поэтому мне пришлось перекомпилировать ее перед обновлением с .NET 2.0 до .NET 3.5.Это то, что я прокомментировал.Это единственная ошибка, о которой я знаю.

    private void RedirectToNextView(string previousView, ViewSettings viewSettings)
    {
        try
        {
            //if (previousView == null)
            //    HttpContext.Current.Response.Redirect(HttpContext.Current.Request.ApplicationPath + "/" + viewSettings.Type, true);
            //else
            //    HttpContext.Current.Response.Redirect(HttpContext.Current.Request.ApplicationPath + "/" + viewSettings.Type, false);
            if (previousView == null)
                HttpContext.Current.Response.Redirect(HttpContext.Current.Request.ApplicationPath.TrimEnd('/') + viewSettings.Type, true);
            else
                HttpContext.Current.Response.Redirect(HttpContext.Current.Request.ApplicationPath.TrimEnd('/') + viewSettings.Type, false);
        }
        catch (System.Threading.ThreadAbortException) { }
    }

Вот код Global.asax.vb: (опять же, этот код сейчас не имеет значения, потому что он не дойдет до сих пор, за исключением брошенного исключения)

Sub Application_BeginRequest(ByVal sender As Object, _
                             ByVal e As EventArgs)
    ' Fires at the beginning of each request
    Dim originalUri As Uri = Request.Url
    Dim rewrittenUrl As String = String.Empty

    'Rewrite Saliva and Hair Testing urls 
    Select Case True
        Case originalUri.AbsolutePath.StartsWith("/HairTest/")
            rewrittenUrl = originalUri.AbsolutePath.Remove(0, 9)

            If Not originalUri.Query.Contains("SampleTypeContext=247") Then
                rewrittenUrl += "?sampleTypeContext=247"
            End If
        Case originalUri.AbsolutePath.StartsWith("/SalivaTest/")
            rewrittenUrl = originalUri.AbsolutePath.Remove(0, 11)

            If Not originalUri.Query.Contains("SampleTypeContext=3301") Then
                rewrittenUrl += "?sampleTypeContext=3301"
            End If
    End Select

    If rewrittenUrl <> String.Empty Then
        'append the original query if there was one specified
        If originalUri.Query <> String.Empty Then
            If rewrittenUrl.Contains("?") Then
                rewrittenUrl += "&"
            Else
                rewrittenUrl += "?"
            End If
            rewrittenUrl += originalUri.Query.Remove(0, 1)
        End If
        Context.RewritePath(rewrittenUrl)
    End If
End Sub

Приложение фактически вызывает исключение, описанное выше, когда я пытаюсь предварительно подождать мой URL (переменная viewSettings.Type выше) с помощью "/ HairTest" или "/ SalivaTest".Это вызывает то исключение System.Threading.ThreadAbortException.Я думаю, потому что этот путь на самом деле не существует в нашем веб-приложении, но я просто думаю.Обратите внимание, что мы делаем переписывание в нашем глобальном, а не редирект.Наша перезапись добавляет к URL-адресу «/ HairTest» или «/SalivaTest".

. Все страницы в нашем веб-приложении ожидают параметр« SampleTypeContext », если он ему нужен.Если вы можете придумать, как лучше работать в этой ситуации, дайте мне знать.Я постараюсь получить более подробную информацию об исключении.

В поисках идей!Наш архитектурный подход все еще подлежит обсуждению, если мы столкнемся с проблемами с этим блоком UIProcess.Мы не можем просто избавиться от блока UIP, поскольку он используется в нашем приложении, но я могу изменить приведенный выше код (в моем первом фрагменте кода), если нам нужно.

1 Ответ

0 голосов
/ 08 декабря 2011

Нет стандартного способа сделать это с помощью блока UIP.И Microsoft больше не поддерживает это.Я перегрузил кучу методов в библиотеке, чтобы она заработала.Так что мы можем добавить параметр строки запроса (applicationScope) к каждому из наших вызовов перенаправления UIP.

Если вам нужен код, добавьте сюда комментарий, и я вышлю вам исходный код.

...