我们正在使用IIS 8.5将经典的asp应用程序从我们的Windows 2003(我知道,我们知道的几台服务器)运行IIS)转移到使用IIS 8.5的Windows Server 2012 R2计算机上。
我已经完成了安装和配置asp的所有必要步骤:添加了asp角色/功能,启用了父路径,我在“经典模式”下运行我的应用程序,并添加了.asp MIME类型和处理程序映射,我可以点击我的.asp页面,但我们的主页,标题为Main.asp,只有一点HTML并使用关于Server.Execute“some_page.asp”调用调用其所有功能,我收到了错误主题行。
这在我们2003年的盒子上已经运行好多年了,但是现在,它几乎就像控件被转移到我们应用程序中的另一个脚本或paglet时,有些东西因数据库功能而变得不可思议。我将在下面发布一些代码:
Main.asp页面:
<%
Response.Expires = 0
Response.Buffer = True
Server.Execute "gbl_Init.asp"
%>
<HTML>
<HEAD>
<TITLE>Site Name</TITLE>
<LINK REL=STYLESHEET TYPE="text/css" HREF="styles/sitename.css?2">
<% Server.Execute "gbl_Script.asp" %>
</HEAD>
<BODY BGCOLOR=#FFFFFF LEFTMARGIN="5" TOPMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0">
<% Server.Execute "gbl_Printable.asp" %>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="100%" class="noprint" HEIGHT="82">
<TR>
<TD WIDTH="220" ALIGN="left"><A HREF="Main.asp?PageID=1"><IMG SRC="images/global/home_logo.jpg" BORDER="0"></A></TD>
<TD WIDTH="380" ALIGN="left"><A HREF="Main.asp?PageID=1"><IMG SRC="images/global/home_welcome.gif" BORDER="0"></A></TD>
<TD BACKGROUND="images/global/home_background.jpg"> </TD>
</TR>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="4" BORDER="0" WIDTH="100%" class="noprint">
<TR>
<TD CLASS="HeadingPurpleSM" WIDTH="50%" ALIGN="left"> <% Server.Execute "gbl_Search.asp" %> </TD>
<TD CLASS="HeadingPurpleSM" WIDTH="50%" ALIGN="right"><% Server.Execute "gbl_Welcome.asp" %></TD>
</TR>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="1" WIDTH="100%" BORDERCOLOR="#CCCCCC" class="noprint">
<TR>
<TD COLSPAN="2" WIDTH="100%" ALIGN="left"> <% Server.Execute "gbl_Crumb.asp" %> </TD>
</TR>
</TABLE>
<% Server.Execute "gbl_Tabs.asp" %>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="100%">
<TR>
<TD><% Server.Execute "gbl_Content.asp" %></TD>
</TR>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="100%" class="noprint">
<TR>
<TD CLASS="FooterNav" ALIGN="center"> <% Server.Execute "gbl_Footer.asp" %> </TD>
</TR>
</TABLE>
</BODY>
</HTML>
gbl_Script.asp页面:
<!--#Include file="Framework/version3/lib_Common_DB.asp" -->
<%
'***************************************************
' GLOBAL DECLARATIONS
'***************************************************
dim gobjCn, gstrCn
dim gstrPageID
dim gstrSessionID
dim garrPage
dim gstrNetDomainNM
dim gstrNetUserNM
dim gstrNetGroups
dim gstrMemberID
dim gstrMemberNM
dim garrMember
'***************************************************
' PAGE INPUT VARIABLES
'***************************************************
gstrPageID = request.querystring("PageID")
gstrCn = Application("strAdminConnectionString") 'in Global.asa file
gstrSessionID = request.cookies("session")
'***************************************************
' MAIN
'***************************************************
Call Main
Sub Main
'PageID syntax
If len(gstrPageID)> 0 Then
If Not IsNumeric(gstrPageID) Then
Response.Redirect "Main.asp?PageID=1"
End If
Else
Response.Redirect "Main.asp?PageID=1"
End If
set gobjCn = ConnectDb(gstrCn)
'PageID active and exists
RetrieveData
If NOT IsArray(garrPage) Then
Response.Redirect "Main.asp?PageID=1"
End If
'Session Validation
If len(trim(gstrSessionID)) = 0 Then
'Authentication
larrNetNM = Split(Request.ServerVariables("AUTH_USER"),"\",-1,1)
gstrNetDomainNM = larrNetNM(0)
gstrNetUserNM = larrNetNM(1)
'If gstrNetUserNM = "someusername" Then
' gstrNetUserNM = "someotherusername"
'End If
RetrieveData_MEMBER
If IsArray(garrMember) Then
gstrMemberID = garrMember(0,0)
gstrMemberNM = garrMember(1,0)
Else
SetupNewMember
End If
CreateSession
LoginAudit
If gstrNetDomainNM = "OUR COMPANY" Then
UpdateMemberADGroups
Else
UpdateMemberNTGroups
End If
Else
RetrieveData_SESSION
End If
DisConnectDB(gobjCn)
End Sub
'***************************************************
' GET DATA
'***************************************************
Sub RetrieveData()
Dim Parms(0)
Parms(0) = Array("@PageID",adInteger,adParamInput,4,gstrPageID)
garrPage = SqlQuery(gobjCn,"sp","usp_Page_Init",Parms,retArray)(0)
End Sub
Sub RetrieveData_SESSION()
Dim Parms(0)
Parms(0) = Array("@SessionID",adVarChar,adParamInput,60,gstrSessionID)
larrSession = SqlQuery(gobjCn,"sp","usp_Get_Session",Parms,retArray)(0)
If IsArray(larrSession) Then
gstrMemberID = larrSession(1,0)
Else
Response.cookies("session") = ""
Response.Redirect "Main.asp?PageID=1"
End If
End Sub
Sub RetrieveData_MEMBER()
Dim Parms()
If gstrNetDomainNM = "OUR_COMPANY""
ReDim Parms(0)
Parms(0) = Array("@NetUserNM",adVarChar,adParamInput,30,gstrNetUserNM)
garrMember = SqlQuery(gobjCn,"sp","usp_Get_Org_Member_AD",Parms,retArray)(0)
Else
ReDim Parms(1)
Parms(0) = Array("@NetDomainNM",adVarChar,adParamInput,30,gstrNetDomainNM)
Parms(1) = Array("@NetUserNM",adVarChar,adParamInput,30,gstrNetUserNM)
garrMember = SqlQuery(gobjCn,"sp","usp_Get_Org_Member",Parms,retArray)(0)
End If
End Sub
'***************************************************
' MISC FUNCTIONS
'***************************************************
Sub CreateSession()
Dim Parms(2)
Parms(0) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(1) = Array("@MemberNM",adVarChar,adParamInput,80,gstrMemberNM)
Parms(2) = Array("@SessionID",adGUID,adParamOutput,16,"")
OutArray = SqlCmd(gobjCn,"SP","usp_Ins_Session",Parms,retArray)
gstrSessionID = retArray(2)
response.cookies("session") = gstrSessionID
response.cookies("session").expires = DateAdd("d", 1, Date)
End Sub
Sub SetupNewMember
Set lobjUser = GetObject("WinNT://" & gstrNetDomainNM & "/" & gstrNetUserNM)
larrUser = Split( lobjUser.FullName, "," )
lstrFirstNM = Trim( larrUser( UBound( larrUser ) ) )
lstrLastNM = Trim( larrUser( LBound( larrUser ) ) )
Dim Parms(4)
Parms(0) = Array("@NetworkDomainNM",adVarChar,adParamInput,80,gstrNetDomainNM)
Parms(1) = Array("@NetworkUserNM",adVarChar,adParamInput,80,gstrNetUserNM)
Parms(2) = Array("@LastNM",adVarChar,adParamInput,80,lstrLastNM)
Parms(3) = Array("@FirstNM",adVarChar,adParamInput,80,lstrFirstNM)
Parms(4) = Array("@MemberID",adInteger,adParamOutput,4,"")
OutArray = SqlCmd(gobjCn,"SP","usp_Ins_Org_Member",Parms,retArray)
gstrMemberID = retArray(4)
gstrMemberNM = lstrFirstNM & " " & lstrLastNM
End Sub
Sub UpdateMemberNTGroups()
dim Parms(2)
dim lstrRoles
Set lobjUser = GetObject("WinNT://" & gstrNetDomainNM & "/" & gstrNetUserNM)
lstrRoles = "<root>"
For Each Prop in lobjUser.Groups
lstrNM = Replace(Prop.Name,"&","&",1,-1,1)
lstrRoles = lstrRoles & "<role nm=" & """" & lstrNM & """" & "/>"
Next
lstrRoles = lstrRoles & "</root>"
Parms(0) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(1) = Array("@DomainNM",adVarChar,adParamInput,80,gstrNetDomainNM)
Parms(2) = Array("@RoleList",adVarChar,adParamInput,2000,lstrRoles)
OutArray = SqlCmd(gobjCn,"sp","usp_Upd_Roles",Parms,retArray)
End Sub
Sub LoginAudit()
lstrBrowser = request.servervariables("HTTP_USER_AGENT")
If Len(lstrBrowser) > 200 Then lstrBrowser = Left(lstrBrowser, 200)
lstrClientIP = request.servervariables("REMOTE_ADDR")
Dim Parms(4)
Parms(0) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(1) = Array("@LoginDT",adDBDate,adParamInput,8,Now)
Parms(2) = Array("@SessionID",adGUID,adParamInput,16,gstrSessionID)
Parms(3) = Array("@ClientIP",adVarChar,adParamInput,16,lstrClientIP)
Parms(4) = Array("@ClientTYPE",adVarChar,adParamInput,200,lstrBrowser)
OutArray = SqlCmd(gobjCn,"sp","usp_Ins_Login_Audit",Parms,retArray)
End Sub
Sub LogEntry()
dim Parms(4)
Parms(0) = Array("@SessionID",adGUID,adParamInput,40,gstrSessionID)
Parms(1) = Array("@FtpADDR",adVarChar,adParamInput,40,request.servervariables("REMOTE_ADDR"))
Parms(2) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(3) = Array("@PageID",adVarChar,adParamInput,40,gstrPageID)
Parms(4) = Array("@UrlDESC",adVarChar,adParamInput,255,request.servervariables("QUERY_STRING"))
OutArray = SqlCmd(gobjCn, "sp", "usp_Ins_Session_Log", Parms, retArray)
End Sub
Sub UpdateMemberADGroups()
dim larr()
dim Parms()
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
con.Open "Provider=ADsDSOObject","USERNAME","PASSWORD"
Set com = Server.CreateObject("ADODB.Command")
Set com.ActiveConnection = con
lstrSql = "SELECT distinguishedName FROM sometable"
com.CommandText = lstrSql
Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30
Com.Properties("searchscope") = 2
Com.Properties("Chase referrals") = 6
Com.Properties("Cache Results") = False
Set rs = Com.Execute
rs.MoveFirst
i=0
If rs.Fields(i).Type = 12 And Not (IsNull(rs.Fields(i).Value)) Then
larrTemp = rs.Fields(i).Value
For j = LBound(larrTemp) To UBound(larrTemp)
lstrName = ltrim(larrTemp(j))
Next
Else
lstrName = ltrim(rs.Fields(i).Value)
End If
rs.close
Set rs = nothing
Set com = nothing
Set com = Server.CreateObject("ADODB.Command")
Set com.ActiveConnection = con
lstrSql = "SELECT cn FROM sometable ORDER BY cn"
com.CommandText = lstrSql
Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30
Com.Properties("searchscope") = 2
Com.Properties("Chase referrals") = 6
Com.Properties("Cache Results") = False
Set rs = Com.Execute
rs.MoveFirst
lstrRoles = "<root>"
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
If rs.Fields(i).Type = 12 And Not (IsNull(rs.Fields(i).Value)) Then
larrTemp = rs.Fields(i).Value
For j = LBound(larrTemp) To UBound(larrTemp)
lstrNM = Replace(ltrim(larrTemp(j)),"&","&",1,-1,1)
lstrRoles = lstrRoles & "<role nm=" & """" & lstrNM & """" & "/>"
Next
Else
lstrNM = Replace(ltrim(rs.Fields(i).Value),"&","&",1,-1,1)
lstrRoles = lstrRoles & "<role nm=" & """" & lstrNM & """" & "/>"
End If
' TODO: update stored procedure to take varchar(max) and delete this block
If Len( lstrRoles ) > 1500 Then
lstrRoles = lstrRoles & "</root>"
Redim Parms(2)
Parms(0) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(1) = Array("@DomainNM",adVarChar,adParamInput,80,gstrNetDomainNM)
Parms(2) = Array("@RoleList",adVarChar,adParamInput,2000,lstrRoles)
OutArray = SqlCmd(gobjCn,"sp","usp_Upd_Roles_AD",Parms,retArray)
lstrRoles = "<root>"
End If
rs.movenext
next
wend
lstrRoles = lstrRoles & "</root>"
' TODO: Remove If/End If from around this block
If lstrRoles <> "<root></root>" Then
Redim Parms(2)
Parms(0) = Array("@MemberID",adInteger,adParamInput,4,gstrMemberID)
Parms(1) = Array("@DomainNM",adVarChar,adParamInput,80,gstrNetDomainNM)
Parms(2) = Array("@RoleList",adVarChar,adParamInput,2000,lstrRoles) ' TODO: Change size to -1
OutArray = SqlCmd(gobjCn,"sp","usp_Upd_Roles_AD",Parms,retArray)
End If
End Sub
%>
最后,我们的数据库逻辑所在的包含文件(我在下面添加了一条注释,显示了主题错误始终发生的行):
<%
Const adPersistXML = 1
Const adCmdStoredProc = &H0004
Const adCmdText = &H0001
Const adExecuteNoRecords = &H00000080
Const adParamInput = &H0001
Const adParamOutput = &H0002
Const adFldUpdatable = &H00000004
Const adInteger = 3
Const adCurrency = 6
Const adBSTR = 8
Const adBoolean = 11
Const adGUID = 72
Const adChar = 129
Const adDBDate = 133
Const adVarChar = 200
Const adLongVarChar = 201
Const adTypeBinary = 1
Const adTypeText = 2
Const adLongVarBinary = 205
Const adSaveCreateOverWrite = 2
Const adDefaultStream = -1
Function ConnectDB(cnStr)
On Error Resume Next
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open cnStr
If cn.Errors.Count > 0 Then
Set ConnectDB = Nothing
Exit Function
End If
Set ConnectDB = cn
End Function
Sub DisConnectDB(cn)
cn.close
set cn = nothing
End Sub
Public Function SqlQuery(cn, cmdType, cmdStr, params, byRef OutArray)
Dim rs, cmd, OutPutParms
dim arrRS(5)
Set cmd = Server.CreateObject("ADODB.Command")
Set rs = Server.CreateObject("ADODB.Recordset")
cmd.ActiveConnection = cn
cmd.CommandText = cmdStr
cmd.CommandTimeout = 60
if ucase(cmdType) = "SP" then
cmd.CommandType = adCmdStoredProc
else
cmd.CommandType = adCmdText
end if
collectParams cmd, params, OutPutParms
set rs = cmd.Execute '************ERROR HAPPENS HERE********
i=0
if not rs.eof then
do until rs is nothing
If rs.eof Then
Exit Do
End If
arrRS(i) = rs.getrows
set rs = rs.NextRecordset
i=i+1
loop
end if
if OutPutParms then
OutArray = collectOutputParms(cmd, params)
arrRS(i) = OutArray
end if
SqlQuery = arrRS
set rs = Nothing
set cmd = Nothing
End Function
Public Function SqlCmd(cn, cmdType, cmdStr, params, byRef OutArray)
Dim cmd, OutPutParms
Set cmd = Server.CreateObject("adodb.Command")
cmd.ActiveConnection = cn
cmd.CommandText = cmdStr
if ucase(cmdType) = "SP" then
cmd.CommandType = adCmdStoredProc
else
cmd.CommandType = adCmdText
end if
collectParams cmd, params, OutPutParms
cmd.Execute , , adExecuteNoRecords
if OutPutParms then
OutArray = collectOutputParms(cmd, params)
end if
set cmd = Nothing
SqlCmd = 0
End Function
Public Function SqlQueryRecordset(cn, cmdType, cmdStr, params)
Dim cmd: Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = cn
cmd.CommandText = cmdStr
if ucase(cmdType) = "SP" then
cmd.CommandType = adCmdStoredProc
else
cmd.CommandType = adCmdText
end if
collectParams cmd, params, OutPutParms
Set SqlQueryRecordset = cmd.Execute
set cmd = Nothing
End Function
Private Sub collectParams(ByRef cmd, ByVal argparams, ByRef OutPutParms)
Dim params, v
Dim i, l, u
'if argparams is empty
If Not IsArray(argparams) Then Exit Sub
OutPutParms = false
params = argparams
For i = LBound(params) To UBound(params)
l = LBound(params(i))
u = UBound(params(i))
' Check for nulls.
If u - l >= 3 Then
If VarType(params(i)(4)) = vbString Then
if params(i)(4) = "" then
v=null
else
v=params(i)(4)
end if
Else
v = params(i)(4)
End If
if params(i)(2) = adParamOutput then OutPutParms = true
cmd.Parameters.Append cmd.CreateParameter(params(i)(0), params(i)(1), params(i)(2), params(i)(3), v)
Else
err.raise m_modName, "collectParams(...): incorrect # of parameters"
End If
Next
End Sub
Private Function collectOutputParms(ByRef cmd, argparams)
Dim params, v, OutArray(40)
Dim i, l, u
'if argparams is empty
'If Not IsArray(argparams) Then Exit Sub
params = argparams
For i = LBound(params) To UBound(params)
OutArray(i) = cmd.Parameters(i).Value
Next
collectOutputParms = OutArray
End Function
%>
我知道这是需要审核的大量代码,抱歉。但希望其他人有同样的问题并知道如何解决它。我尝试用页面中的代码替换我的一个Server.Execute()调用,所以基本上将调用的页面硬编码到Main.asp中,但我仍然得到错误。