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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top