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