Question

Récemment je suis tombé sur un problème qui consiste à déplacer asp des sites classiques d'un serveur w2k3 à un environnement w2k8 64. Il implique l'obtention des services d'indexation au travail avec asp classique. J'ai cherché partout essayé de nombreuses solutions et ils ont tous échoué.

Le problème: l'exécution d'un service d'indexation de 64 bits sur un pool d'applications 32 bits (pour asp classique) pages ASP exécutant demande au service d'indexation a entraîné une erreur lorsque l'objet serveur a échoué à la charge. bien que le service d'indexation a été en cours d'exécution et le dossier contenant les documents du site où indexé le service d'indexation est en cours d'exécution en mode 64 bits et la piscine en mode 32 bits. Il n'a pas été possible de faire fonctionner.

Certaines des solutions proposées a été de réécrire le code pour utiliser la nouvelle « Windows Search » Mais puisque cela fonctionne aussi dans 64bit, il ne pouvait pas être exécuté en mode application 32 bits. Passage en mode compatible 32bit dans la piscine a donné de ne pas les bases de données de travail et autres com objets utilisés par les sites asp.

Était-ce utile?

La solution


Après quelques jours, je presque abandonné, mais au milieu de la nuit, j'ai eu une idée brillante pour obtenir tout travail. Que faire si je fais un appel ajax à un sous-domaine sur le serveur Web qui est en cours d'exécution en mode 64 bits avec des répertoires virtuels contenant les répertoires indexés des sites en cours d'exécution en mode application 32 bits.

Le lendemain, après un sommeil agité de je suis arrivé au travail, a ajouté une nouvelle sous-domaine dans IIS7 ajouté répertoires virtuels aux répertoires indexés des sites. et ajouter une page « indexer.asp » qui contient un gestionnaire de requêtes.

<%@ 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


%>

Alors j'ai fait une page de demande sur l'un des sites en cours d'exécution en mode application 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

`

Explication:

  • Parse nom du catalogue de service d'indexation, recherche de chaîne, max a donné des documents
  • Dans un sous-domaine créer des répertoires virtuels (appelés comme le catalogue d'index) qui redirige vers l'emplacement d'origine du répertoire qui a été indexé
  • Ajoutez une page indexer.asp qui gère les appels de demande
  • Code alter objet demande existante de la page Web d'origine pour faire un appel ajax ci-dessus subdomain

Avantages:

  • Faire une demande Ajax sur le site Web de asp classique fonctionnant en mode application 32 bits à une application 64 bits et les résultats de retour.
  • Vous pouvez également inclure Adobe PDF IFilter (64bit) au format PDF index et lu dans les fichiers PDF.
  • Facile à modifier le code existant asp des sites. changements mineurs
  • Exécuter indexeur sur la piscine 64bit séparée et sous-domaine
  • Ajoutez plusieurs catalogues facile conservés sur un emplacement
  • Rendre l'impossible possible: en cours d'exécution asp classique avec service d'indexation de 64 bits en mode application 32 bits
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top