Cómo consultar el servicio de índice x64 Windows 2008 desde las aplicaciones ASP de 32 bits?
-
29-09-2019 - |
Pregunta
Hace poco tropezó con un problema que implica pasar asp sitios clásicos de un servidor a un entorno w2k3 W2K8 64. Se trataba de conseguir los servicios de indexación para trabajar con ASP clásico. He buscado por todas partes intentado muchas soluciones y todos fracasaron.
El problema: la ejecución de un servicio de indexación de 64 bits en un grupo de aplicaciones de 32 bits (para ASP clásico) Las páginas ASP se ejecutan solicitud al servicio de indexación dieron lugar a error por el que el objeto servidor no pudo cargar. aunque el servicio de indexación estaba corriendo y la carpeta que contiene los documentos del sitio en el que indexa el servicio de indexación se ejecuta en modo de 64 bits y la piscina en el modo de 32 bits. No fue posible ejecutar.
Algunas de las soluciones sugeridas era reescribir el código para utilizar el nuevo 'de búsqueda de Windows' Pero como esto también está en 64 bits no se puede ejecutar en modo de aplicación de 32 bits. El cambio a 32bit modo compatible en la piscina como resultado de las bases de datos que no trabajan y otros objetos COM utilizado por los sitios ASP.
Solución
Después de un par de días que casi abandonado, pero en el medio de la noche me dio una idea brillante para ponerlo todo en marcha. ¿Qué pasa si hago una llamada ajax a un dominio secundario en el servidor web que se ejecuta en modo de 64 bits con los directorios virtuales que contienen los directorios indexado de los sitios que se ejecutan en el modo de aplicación de 32 bits.
Al día siguiente, después de un sueño intranquilo llegué al trabajo, añadido un nuevo subdominio en IIS7 añadió directorios virtuales a los directorios de los sitios web indexados. y añadió una página 'indexer.asp' que contiene un controlador de solicitudes.
<%@ Language=VBScript %><%
Option explicit
response.buffer=true
dim RequestIndex, strFileError, RequestSearchString, FSOA, RequestMax
RequestIndex=request.querystring("Index")
RequestSearchString=request.querystring("Search")
RequestMax=request.querystring("Size")
' INDEXER
sub DoIndexSearch(target, RequestIndex)
dim foundfilearray:foundfilearray=false
dim ixQuery ' Index Server query object.
set ixQuery = Server.CreateObject("ixsso.Query")
if (Err.description <> "") Then
strFileError= ("<div><strong>Query object Error : " & Err.description & ".</strong></div>")
response.write strFileError
Exit sub
end if
ixQuery.Query =(target)
'ixQuery.SortBy = "DocLastSavedTm[d]"
ixQuery.SortBy = "Rank[d]"
ixQuery.Columns = "FileName," 'Parameter: columns returned (one this case a one dimensional array)
ixQuery.LocaleID = 1043 'Parameter: language
ixQuery.MaxRecords =RequestMax 'Parameter: max returned documents
ixQuery.Catalog = RequestIndex 'IndexService ' Which indexing service
' Create a search utility object to allow us to specify the search type as deep,meaning it will search recursively down through the directories
dim util
set util = Server.CreateObject("ixsso.Util")
util.AddScopeToQuery ixQuery, Server.MapPath(RequestIndex), "deep"
if (Err.description <> "") Then
strFileError= ("<div><strong>Search Utility Error : " & Err.description & "</strong></div>")
response.write strFileError
Exit sub
end if
' Run the query (i.e. create the recordset).
dim QueryRS
set queryRS = ixQuery.CreateRecordSet("nonsequential")
' Check the query result. If it timed out or return no records, then show
' an appropriate message. Otherwise, show the hits.
if (Err.description <> "") Then
strFileError= "<div><strong>search error : " & Err.description & "</strong></div>"
response.write strFileError
queryRS.close
set queryRS = nothing
set ixQuery = nothing
set util = nothing
Exit sub
elseif queryrs.recordcount = 0 then
strFileError="<div><strong>no documents found.</strong></div>"
response.write strFileError
queryRS.close
set queryRS = nothing
set ixQuery = nothing
set util = nothing
Exit sub
else
FSOA= QueryRS.getrows()
queryRS.close
set queryRS = nothing
set ixQuery = nothing
set util = nothing
Exit sub
end if
end Sub
call DoIndexSearch(RequestSearchString,RequestIndex)
' TESTING PURPOSE
dim strTestResult
strTestResult= "<html><head></head><body style=""font-family:Verdana, arial"">"
strTestResult=strTestResult& "<h1>Testing 64bit classic asp indexing using windows 2008 64bit server</h1>"
strTestResult=strTestResult& "<h3>Search in index <em>"&RequestIndex&"</em> for <em>"&RequestSearchString&"</em> with max <em>"&requestMax&"</em> results</h3>"
strTestResult=strTestResult& "<p>Using a seperate website running a 64bit classic pool, wich contains a virtual directory named after the Index which contains the path to the directory of the website that is indexed.</p>"
strTestResult=strTestResult& "<p>The returned results is a one dimensional array containing the filenames where searchstring is found in. This array can be passes back using ajax/json</p>"
if isarray(fsoa) then
strTestResult=strTestResult& " <hr>"
strTestResult=strTestResult& "<fieldset><legend>Found items for "&RequestSearchString&" </legend>"
dim xloop:xloop=0
strTestResult=strTestResult& " <ol>"
for each xloop in fsoa
strTestResult=strTestResult& "<li>"&Xloop&" </li>"
next
strTestResult=strTestResult& " </ol></fieldset></body></html>"
strTestResult=strTestResult& "<hr>"
strTestResult=strTestResult& "<h1>AJAX return array</h1>"
else
strTestResult=strTestResult& " no items found"
end if
' response.write strTestResult ' (Remark when done testing)
' END TESTING
' RETURN INDEXING RESULT TO AJAX/JSON CALLER (one dim array)
if strFIleError="" then
xloop=0
dim ajaxresult
for each xloop in FSOA
ajaxresult=ajaxresult & ucase(Xloop) &"|"
next
ajaxresult=Left(ajaxresult,Len(ajaxresult)-1)
response.write ajaxresult
end if
%>
Luego me hizo una página de solicitud en uno de los sitios web que se ejecutan en el modo de aplicación de 32 bits:
dim FSOA 'return documents file array
'search inside documents
sub DoSearchText(target, indexservice)
'target = search string
'indexservice = catalog name (index service)
dim IndexArray() 'one dimensional array for index result
dim xmlhttp, tempArray, IndexUrl
'url to the 64bit indexer subdomain
IndexURL = ("http://indextest.subdomain.local/indexer.asp?Index="&IndexService&"&Search="&target&"&Size=50")
set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open "GET", IndexURL, false
xmlhttp.send ""
if xmlhttp.status >= 400 and xmlhttp.status <=599 then
response.write " error processing: " &xmlhttp.status &" - "&xmlhttp.statusText
else
tempArray= xmlhttp.responseText
end if
set xmlhttp = nothing
'put result into a array
FSOA= split(tempArray,"|")
end Sub
call DoSearchText("chapter one", "sitebooks")
if isarray(FSOA) then
dim docloop
for each docloop in FSOA
response.write "<div>"&docloop&"</div>"
next
else
response.write "No documents found"
end if
`
Explicación:
- Analizar servicio de indexación nombre de catálogo, cadena de búsqueda, max resultó documentos
- En subdominio crear directorios virtuales (nombrados como el catálogo de índice) que redirige a la ubicación original del directorio que ha sido indexado
- Añadir una página indexer.asp que controla la solicitud llamadas
- alter código de petición de objeto existente de la página web original para realizar una llamada ajax anteriormente subdominio
Beneficios:
- Hacer una petición Ajax ASP página web clásico ejecuta en modo de aplicación de 32 bits a una aplicación de 64 bits y los resultados de retorno.
- También puede incluir PDF de Adobe IFilter (64 bits) al índice PDF y leer dentro de los archivos PDF.
- Fácil de alterar el código ASP de sitios existentes. Los cambios menores
- Ejecutar paso a paso en la piscina de 64 bits independiente y subdominio
- Añadir varios catálogos de fácil mantenimiento en una ubicación
- Hacer posible lo imposible: correr ASP clásico con un servicio de 64 bits de indexación en el modo de aplicación de 32 bits