Как запросить службу индексации Windows 2008 x64 из 32-разрядных приложений ASP?

Недавно я столкнулся с проблемой, связанной с перемещением классических сайтов asp с сервера w2k3 в среду w2k8 64. Он заключался в том, чтобы заставить службы индексирования работать с asp classic. Я искал везде, пробовал много решений, и все они потерпели неудачу.

Проблема: запуск 64-битной службы индексирования в 32-битном пуле приложений (для asp classic) ASP-страницах, выполняющих запрос к службе индексирования, приводил к ошибке, когда объект сервера не загружался. хотя служба индексирования была запущена, а папка, содержащая документы сайта, на котором она проиндексирована, работала в 64-битном режиме, а пул - в 32-битном режиме. Бежать не удалось.

Некоторые из предлагаемых решений заключались в переписывании кода для использования нового «поиска Windows». Но поскольку он также работает в 64-битном режиме, его нельзя было запустить в режиме 32-битного приложения. Переключение в 32-битный совместимый режим в пуле из-за неработающих баз данных и других com-объектов, используемых asp-сайтами.


person Plippie    schedule 11.10.2010    source источник
comment
Хорошее расследование и +1. Я бы задала этот вопрос (например, как мне запросить службу индексации Windows 2008 x64 из 32-разрядных приложений ASP?) С отдельным самопринявшимся ответом. Некоторые люди на SO могут быть немного забавными, публикуя «статьи». Вы также можете получить дополнительную ценную информацию от сообщества.   -  person Kev    schedule 11.10.2010
comment
спасибо Кев, переделал вопрос.   -  person Plippie    schedule 11.10.2010
comment
@Bjork Я уже ответил давным-давно и тогда тоже принял его. Какой-то мод удалил мой ответ. Я добавил еще раз ....   -  person Plippie    schedule 23.08.2011


Ответы (1)



Через пару дней я почти сдался, но посреди ночи мне пришла в голову блестящая идея заставить все это работать. Что, если я сделаю ajax-вызов субдомена на веб-сервере, который работает в 64-битном режиме с виртуальными каталогами, содержащими проиндексированные каталоги сайтов, работающих в 32-битном режиме приложения.

На следующий день после беспокойного сна я приступил к работе, добавил новый поддомен в IIS7, добавил виртуальные каталоги в проиндексированные каталоги сайтов. и добавлена ​​страница indexer.asp, содержащая обработчик запросов.

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


%>

Затем я сделал страницу запроса на одном из сайтов, работающих в режиме 32-битного приложения:

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

`

Пояснение:

  • Имя каталога службы индексации синтаксического анализа, строка поиска, максимальное количество найденных документов
  • В поддомене создайте виртуальные каталоги (названные индексным каталогом), которые перенаправляют в исходное расположение каталога, который был проиндексирован.
  • Добавьте страницу indexer.asp, которая обрабатывает вызовы запросов.
  • изменить существующий код объекта запроса исходной веб-страницы, чтобы выполнить вызов ajax для указанного выше поддомена

Преимущества:

  • Сделайте запрос Ajax с классического веб-сайта asp, работающего в режиме 32-битного приложения, в 64-битное приложение и верните результаты.
  • Вы также можете включить Adobe PDF Ifilter (64 бит) для индексации PDF и читать внутри PDF-файлов.
  • Легко изменить существующий asp-код сайтов. Небольшие изменения
  • Запустить индексатор в отдельном 64-битном пуле и субдомене
  • Добавьте несколько каталогов, легко обслуживаемых в одном месте
  • Сделать невозможное возможным: запуск asp classic с 64-битной службой индексирования в 32-битном режиме приложения
person Plippie    schedule 23.08.2011