그런데, Asp VB Script 에서는 하나의 asp.dll 파서를 이용하므로 상관이 없으나, ASP.NET 이 2.0 으로 버젼업이 되면서 각 버젼별로 별도의 aspnet.dll 파서를 이용하게 된다.
c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
응용프로그램 풀에서는 aspx 확장자 처리에 대한 하나의 파서만 로드가 가능하다.
만약 1.1 버젼과 2.0 버젼의 코드로 제작된 웹사이트를 하나의 풀에서 실행을 하게되면 선점된 파서로 실행을 하게 되며, 버젼이 맞지 않는 웹사이트에서는 응용프로그램 풀 로드 오류가 발생하게 된다.
위는 ASP.NET 2.0 버젼이 먼저 호출되어 로드가 된후에, 1.1 버젼을 호출하는 경우 웹사이트 오류를 출력함과 동시에 위와 같은 오류 이벤트가 생성된다.
마찮가지로 1.1 이 먼저 로드된후, 2.0 버젼을 호출한 경우다.
위와 같은 오류상황을 미연에 방지하기 위해서는, 웹사이트를 제작하는 프로그래머가 서버관리자에게 필히 닷넷프레임워크의 버젼을 알려주어야 하며 서버 관리자는 버젼별로 응용프로그램 풀을 별로로 분리해야 한다.
웹사이트 몇개가 안되거나, 할때는 상관없는데 문제는, 웹호스팅 서버와 같은 다수의 웹사이트에 각각의 별도 제작하는 프로그래머가 존재한다면 위와 같은 상황은 발생할 가능성이 높다. 또한 수 십에서 수백개의 웹사이트를 뒤지는 일도 만만치 않는 작업일 것이다.
접속자가 많은 크리티컬한 웹사이트에서 중단이 발생하면,, 암울 할것이다. -_-;
다음 스크립트는, 응용프로그램 풀에 실행요청된 ASP.NET 의 버젼을 확인할수 있는 스크립트이다.
dim AppsInPool, objAppPool, index, IISObj, IISPath, Version, pos
Dim Versions(), objAppPools
function FindASPXScriptMapVersion(ScriptMaps)
Dim pos, ScriptMap
for pos = lbound(ScriptMaps) to UBOund(ScriptMaps)
ScriptMap = lcase(ScriptMaps(POS))
if (left(ScriptMap, 5) = ".aspx") then
FindASPXScriptMapVersion = mid(ScriptMap, 42)
FindASPXScriptMapVersion = left(FindASPXScriptMapVersion, _
instr(FindASPXScriptMapVersion, "\")-1)
exit function
end if
next
FindASPXScriptMapVersion = ""
end function
function AddVersion(Version, Path)
dim Found, pos
Found = false
for pos = lbound(Versions) to UBound(Versions)-1
if (Versions(pos) = Version) then
Found = true
end if
next
if (Found = false) then
redim preserve Versions(ubound(Versions)+1)
Versions(ubound(Versions)-1)= Version
end if
end function
Set objAppPools = GetObject("IIS://localhost/W3SVC/AppPools")
for each objAppPool in objAppPools
Redim Versions(0)
Set objAppPool = GetObject("IIS://localhost/W3SVC/AppPools/" & objAppPool.Name )
WScript.echo objAppPool.Name
AppsInPool= objAppPool.EnumAppsInPool()
if (ubound(AppsInPool) = -1) then
WScript.echo vbtab & "No applications using this pool!"
else
for index = lbound(AppsInPool) to UBound(AppsInPool)
IISPath = AppsInPool(index)
IISPath = "IIS://localhost/" & mid(IISPath,5, len(IISPath)-5)
set IISObj = GetObject(IISPath)
Version = FindASPXScriptMapVersion(IISObj.ScriptMaps)
call AddVersion(Version, mid(IISPath,5, len(IISPath)-5))
next
if (ubound(Versions)> 1) then
WScript.Echo vbcrlf & vbtab & _
"Warning multiple version of the .NET framework detected!" & vbcrlf
for pos = lbound(Versions) to ubound(Versions)-1
WScript.echo vbtab & "Found references to " & Versions(pos)
next
WScript.echo ""
for index = lbound(AppsInPool) to UBound(AppsInPool)
IISPath = AppsInPool(index)
IISPath = "IIS://localhost/" & mid(IISPath,5, len(IISPath)-5)
set IISObj = GetObject(IISPath)
Version = FindASPXScriptMapVersion(IISObj.ScriptMaps)
WScript.echo vbtab & mid(IISPath,5, len(IISPath)-5) & _
space(70 - len(IISpath)) & " - " & Version
next
else
for pos = lbound(Versions) to ubound(Versions)-1
WScript.echo vbtab & "Found references to " & Versions(pos)
next
end if
end if
WScript.echo ""
next
원리는, 각 응용프로그램 풀 목록을 ADSI 를 통해서 확인한 다음에,
각 응용프로그램 풀에 설정된 웹사이트 목록 확인. 그런다음에 각 웹사이트의 aspx 확장자에 대한 파서의 버젼을 확인합니다.
그런후에, 하나라도 서로 다른게 있으면 중복되어 있어 웹사이트 오류가 발생할 수 있다는 것입니다.
샘플 실행 결과는 다음과 같다.
Microsoft (R) Windows Script Host 버전 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
ASP.NET V2.0
Found references to v2.0.50727
DefaultAppPool
Found references to v1.1.4322
MSSharePointAppPool
Found references to v1.1.4322
ReportServer
Warning multiple version of the .NET framework detected!
Found references to v2.0.50727
Found references to
//localhost/W3SVC/1/ROOT/Report - v2.0.50727
//localhost/W3SVC/1/ROOT/ReportServe -
ASP.NET V1.1
No applications using this pool!
12-net1.png
12-net2.png
12-net3.png
댓글 없음:
댓글 쓰기