Domanda

Recentemente sono incappato in un problema che comporta lo spostamento di asp siti classici da un server a un ambiente w2k3 W2K8 64. Ha coinvolto ottenere servizi di indicizzazione di lavorare con ASP classico. Ho cercato in ogni dove provato molte soluzioni e tutti hanno fallito.

Il problema: l'esecuzione di un servizio di indicizzazione a 64 bit su un pool di applicazioni a 32 bit (per ASP classico) pagine ASP in esecuzione richiesta al servizio di indicizzazione portato per errore in cui l'oggetto server non è riuscito a carico. anche se il servizio di indicizzazione è in esecuzione e la cartella contenente documenti del sito in cui indicizzato il servizio di indicizzazione è in esecuzione in modalità a 64 bit e la piscina in modalità a 32 bit. Non è stato possibile eseguire.

Alcune delle soluzioni proposte è stato quello di riscrivere il codice per utilizzare il nuovo 'di ricerca di Windows' Ma poiché questo è in corso anche in 64 bit non poteva essere eseguito in modalità di applicazione a 32 bit. Il passaggio a 32bit modalità compatibile nella piscina risultato di banche dati non di lavoro e altri oggetti COM utilizzati dai siti ASP.

È stato utile?

Soluzione


Dopo un paio di giorni ho quasi rinunciato, ma nel bel mezzo della notte ho avuto una brillante idea per avere tutto di lavoro. Che cosa succede se faccio una chiamata AJAX a un sottodominio sul web server che è in esecuzione in modalità a 64 bit con le directory virtuali che contengono le directory indicizzati dei siti in esecuzione in modalità di applicazione a 32 bit.

Il giorno seguente, dopo un sonno agitato ho avuto modo di lavorare, ha aggiunto un nuovo sottodominio in IIS7 aggiunto directory virtuali alle directory indicizzati dei siti web. e ha aggiunto una pagina 'indexer.asp', che contiene un gestore di richiesta.

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


%>

Poi ho fatto una pagina di richiesta su una delle esecuzione in modalità applicazione a 32 bit siti web:

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

`

Spiegazione:

  • Parse servizio di indicizzazione nome del catalogo, la ricerca della stringa, max portato documenti
  • In sottodominio creare directory virtuali (denominati come il catalogo di indice) che reindirizza alla posizione originale della directory che è stato indicizzato
  • Aggiungi una pagina indexer.asp che gestisce le chiamate di richiesta
  • alter codice di richiesta oggetto esistente della pagina web originale per effettuare una chiamata ajax sopra sottodominio

Vantaggi:

  • Fai una richiesta Ajax dal sito ASP in esecuzione in modalità applicazione a 32 bit a un'applicazione a 64 bit e dei risultati di ritorno.
  • Si può anche includere IFilter PDF di Adobe (64bit) per indicizzare PDF e leggere dentro i file PDF.
  • facile modificare il codice ASP di siti esistenti. Piccole modifiche
  • Esegui indicizzatore sulla piscina a 64 bit separata e sottodominio
  • Aggiungi più cataloghi facile mantenuto su una posizione
  • rendere possibile l'impossibile: in esecuzione ASP classico con un servizio a 64 bit di indicizzazione in modalità applicazione a 32 bit
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top