Условные включения в Classic ASP - файл может отсутствовать на сервере - PullRequest
3 голосов
/ 22 апреля 2010

Я сейчас нахожусь в ситуации, когда мне нужно внести некоторые дополнения в приложение, написанное на классическом ASP, с использованием серверного JScript для IIS.

Дополнения, которые мне нужно сделать, включают в себя добавление серии включений в код на стороне сервера для расширения возможностей приложения. Однако файлы inc могут существовать на сервере не во всех случаях, поэтому мне нужно, чтобы приложение вернулось к существующему поведению (игнорирует включения), если файлы не существуют, вместо того, чтобы генерировать ошибку.

Я знаю, что этого нельзя достичь, используя операторы if в коде JScript из-за способа работы SSI, и не сталкивался с какими-либо способами динамического включения кода на стороне сервера, где файлы могут не существовать .

Кто-нибудь знает способ сделать это в классическом ASP? Любая помощь будет высоко ценится.

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Вот скрипт для динамического включения файлов asp:

<%
' **** Dynamic ASP include v.2

function fixInclude(content)
   out=""   
   if instr(content,"#include ")>0 then
        response.write "Error: include directive not permitted!"
        response.end
   end if     
   content=replace(content,"<"&"%=","<"&"%response.write ")   
   pos1=instr(content,"<%")
   pos2=instr(content,"%"& ">")
   if pos1>0 then
      before= mid(content,1,pos1-1)
      before=replace(before,"""","""""")
      before=replace(before,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""")
      before=vbcrlf & "response.write """ & before & """" &vbcrlf
      middle= mid(content,pos1+2,(pos2-pos1-2))
      after=mid(content,pos2+2,len(content))
      out=before & middle & fixInclude(after)
   else
      content=replace(content,"""","""""")
      content=replace(content,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""")
      out=vbcrlf & "response.write """ & content &""""
   end if
   fixInclude=out
end function

Function getMappedFileAsString(byVal strFilename)
  Dim fso,td
  Set fso = Server.CreateObject("Scripting.FilesystemObject")
  Set ts = fso.OpenTextFile(Server.MapPath(strFilename), 1)
  getMappedFileAsString = ts.ReadAll
  ts.close  
  Set ts = nothing
  Set fso = Nothing
End Function

execute (fixInclude(getMappedFileAsString("included.asp")))
%>

Последняя строка (начинающаяся с «execute») эквивалентна директиве include, с той разницей, что она может быть включена в оператор if (динамическое включение). 1008 * Bye

2 голосов
/ 22 апреля 2010

Если вы действительно смелый, вы можете прочитать содержимое файла, а затем Eval () it. Но у вас не будет реального указания номеров строк, если что-то пойдет не так во включенном коде.

Как потенциально лучшая альтернатива: не можете ли вы создать некоторый код проверки работоспособности в global.asa для создания включаемых файлов в качестве пробелов, если они не существуют?

0 голосов
/ 05 мая 2010

Решением для этого оказалось использование предложения Томаска включить файлы и установить переменную сеанса со ссылкой на «меня» согласно http://www.aspmessageboard.com/showthread.php?t=229532, чтобы позволить мне иметь доступ к обычной программе переменные области видимости.

(из-за этого я зарегистрировался, но не могу связать мою зарегистрированную учетную запись с моей незарегистрированной)

0 голосов
/ 22 апреля 2010

То, что вы можете сделать, выглядит примерно так:

  • Используйте Scripting.FileSystemObject для обнаружения наличия файлов
  • Используйте Server.Exeecute, чтобы "включить" файлы, илихотя бы выполнить код.

Единственная проблема заключается в том, что файлы не могут совместно использовать обычные переменные области действия программы.

0 голосов
/ 22 апреля 2010

Проще говоря, нет.Почему файлы не существуют?Разве у вас нет пустых файлов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...