Url-адрес не изменяется с помощью Server.Передача в HttpModule

#asp-classic #server.transfer

#asp-classic #server.transfer

Вопрос:

У меня есть HttpModule , который очищает дефисы в URL-адресах в BeginRequest , так что я могу вызвать файл сценария MyFile.asp , но пусть он вызывается с помощью конечной точки, подобной /my-file.asp . (Да, это классический ASP, еще не перенесенный в .NET.)

Код выглядит следующим образом:

 'if not an asp file, skip it
If Not Request.Path.EndsWith(".asp") Then Return

'if the physical file exists, bail out, to let that file service the request
If ("~" amp; Request.RawUrl).ToServerFileObject.Exists Then Return

'if a dehyphenated version of the file exists
If ("~" amp; Request.RawUrl.RemoveHyphens).ToServerFileObject.Exists Then
    'transfer to that file
    application.Server.TransferRequest("~" amp; Request.RawUrl.RemoveHyphens, True)
    Return
End If
 

Когда я запускаю это и запрашиваю myfile.asp , код видит, что файл существует на диске, возвращается, и IIS использует его для обслуживания запроса. Когда я запрашиваю my-file.asp , я ожидал, что он увидит, что файл НЕ существует, а затем увидит, что myfile.asp он существует на диске, и передаст его.

Но вместо этого происходит то, что этот обработчик просто продолжает вызываться снова и снова, и каждый раз Request.RawUrl устанавливается значение my-file.asp . Похоже, что передача работает, но не обновляет запрос, и для меня это не имеет никакого смысла.

Комментарии:

1. Server.transfer не изменяет URL-адрес, но получает файл и возвращает его браузеру под тем же URL-адресом. Вам нужно будет выполнить ответ. Перенаправление. Однако, поскольку это классический asp, я не уверен в деталях здесь.

2. Передача не завершает текущий запрос; он говорит: «прекратите обработку этого и обработайте новый URL», но клиент понятия не имеет, что происходит, и все еще видит исходный запрошенный URL.

3. @Adam: я хочу , чтобы он это сделал, но я хочу, чтобы он возвращал файл, отличный от запрошенного. Я не хочу Redirect , потому что я хочу, чтобы он был невидимым для пользователя.

4. @Cory: Но это не то, что он делает. Он передается, но с тем же именем файла.

5. Итак, вы пробовали отлаживать этот код в отладчике? Вы должны иметь возможность поставить точку останова в начале и посмотреть, что содержит каждая переменная, следуя логике и пути выполнения кода. Возможно, один из ваших методов расширения не выполняет то, что вы думаете.

Ответ №1:

Похоже Request.RawUrl , что всегда сохраняется значение, которое было запрошено изначально, даже после передачи, но есть и другие свойства, такие как Request.AppRelativeCurrentExecutionFilePath или Request.FilePath , которые показывают URL, на который был передан, поэтому я переключился на использование одного из них, и я могу делать то, что мне нужно сейчас. Спасибо всем, кто внес предложения.