Frage

Vor kurzem stieß ich auf ein Problem, die asp klassische Webseiten, die auf einem w2k3 Server zu einer w2k8 64-Umgebung ist das Fahren. Dabei handelte es sich Indizierungsdienste an die Arbeit mit asp classic. Ich suchte überall viele Lösungen ausprobiert, und sie alle gescheitert.

Das Problem: Ausführen eines 64-Bit-Indexdienst auf einem 32-Bit-Anwendungspool (ASP classic) ASP-Seiten auf den Indexdienst in Folge Fehler, wo der Server-Objekt zu Last fehlgeschlagen Lauf Anfrage. obwohl der Indexdienst ausgeführt wurde und die Ordner Dokumente der Site enthalten, wo den Indexdienst indiziert wurden in 64-Bit-Modus und der Pool in 32-Bit-Modus ausgeführt wird. Es war nicht möglich zu laufen.

war Einige der vorgeschlagenen Lösungen, um den Code neu zu schreiben, den neuen verwenden ‚Windows Search‘ Aber da diese auch in 64-Bit läuft es nicht in 32-Bit-Anwendung-Modus ausgeführt werden. Ausschalten kompatiblen Modus 32bit in den Pool führte nicht arbeiten Datenbanken und anderen COM-Objekte von den ASP-Sites verwendet.

War es hilfreich?

Lösung


Nach ein paar Tagen habe ich fast aufgegeben, sondern in der Mitte der Nacht bekam ich eine brillante Idee, es zum Laufen zu bringen. Was passiert, wenn ich einen Ajax-Aufruf zu einer Sub-Domain auf dem Webserver zu machen, die mit virtuellen Verzeichnissen in 64-Bit-Modus laufen die indizierte Verzeichnisse der Stellen enthalten, laufen in Modus 32-Bit-Anwendung.

Am nächsten Tag, nachdem ein unruhiger Schlaf ich zur Arbeit komme, eine neue Sub-Domain in IIS7 hinzugefügt virtuelle Verzeichnisse auf die indizierte Verzeichnisse der Websites hinzugefügt. und fügte hinzu, eine 'indexer.asp' Seite, die einen Request-Handler enthält.

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


%>

Dann habe ich eine Anfrage Seite auf einer der Websites, laufen in 32-Bit-Anwendung Modus:

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

`

Erklärung:

  • Parse Indexdienst Katalognamen suchen Zeichenfolge, ergab max Dokumente
  • Sub-Domain erstellen virtuelle Verzeichnisse (benannt als Index-Katalog), dass Umleitungen an den ursprünglichen Speicherort des Verzeichnisses, das indiziert
  • wurde
  • Fügen Sie eine indexer.asp Seite, dass die Anforderung bearbeiten Anrufe
  • alter bestehende Anfrage Objektcode von Original-Webseite ein Ajax-Aufruf zu machen, um über Sub-Domain

Vorteile:

  • Erstellen Sie eine Ajax-Anfrage von asp klassischen Website läuft in 32-Bit-Anwendungsmodus auf eine 64-Bit-Anwendung und Ergebnisse zurück.
  • Sie können auch enthalten Adobe PDF IFilter (64bit) indizieren PDF und in PDF-Dateien lesen.
  • Einfache vorhandene ASP-Code Websites zu ändern. Geringfügige Änderungen
  • Ausführen Indexer auf separaten 64-Bit-Pool und Sub-Domain
  • mehr Kataloge hinzufügen einfach an einem Ort gehalten
  • Unmögliche möglich machen: Laufen asp classic mit 64-Bit-Indexdienst in 32-Bit-Anwendungsmodus
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top