Классическая ошибка ASP с запросом XMLHTTP

#asp.net #iis-7 #asp-classic #xmlhttprequest

#asp.net #iis-7 #asp-классический #xmlhttprequest

Вопрос:

Я запускаю классический ASP вместе с ASP.net 4.0 на IIS 7.5.

В моем классическом ASP-коде этот код:

 ' Process @ alerts
Dim objHttp
set objHttp = Server.CreateObject("Microsoft.XMLHTTP")

objHttp.open "POST", strSiteRoot amp; "handlers/forumalerts.ashx?", false
objHttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHttp.Send "topicID=" amp; lngTopicID amp; "amp;threadID=" amp; lngLastPostID

set objHttp = nothing
  

Это отправка запроса на ASP.net Обработчик ASHX. При запуске он зависает на долгое время, прежде чем окончательно отправить сообщение об ошибке:

msxml3.dll ошибка ‘800c0008’

Загрузка указанного ресурса завершилась неудачно.

/forum/new_post.asp, строка 1036

Я проверил URL, на который он отправляется, и он существует и функционирует. Отправляемые данные также верны.

До того, как я установил Windows 7, все работало нормально. После переустановки его заново и повторной настройки IIS этот фрагмент кода завершается с ошибкой, что заставляет меня полагать, что это ошибка разрешений / идентификации.

Кто-нибудь может сказать мне, что может быть причиной этого? У меня есть 3 пула приложений:

 ASP.net v4.0 (Integrated) (ApplicationPoolIdentity)
ASP.net v4.0 Classic (Classic) (ApplicationPoolIdentity)
DefaultAppPool (Integrated) (NetworkService)
  

Спасибо за любую помощь!

Редактировать: я нашел эту ошибку в журналах:

 Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 02/11/2011 14:55:42 
Event time (UTC): 02/11/2011 14:55:42 
Event ID: 4e550d910b934d2781707701f833e18e 
Event sequence: 39 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/1/ROOT-2-129647191892089824 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:inetpubwwwrootScirraNew 
    Machine name: TOM-PC 

Process information: 
    Process ID: 7980 
    Process name: w3wp.exe 
    Account name: NT AUTHORITYNETWORK SERVICE 

Exception information: 
    Exception type: ArgumentNullException 
    Exception message: Value cannot be null.
Parameter name: String
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBufferamp; number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at forumalerts.ProcessRequest(HttpContext context) in c:inetpubwwwrootScirraNewHandlersforumalerts.ashx:line 13
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Booleanamp; completedSynchronously)



Request information: 
    Request URL: http://127.0.0.1/handlers/forumalerts.ashx 
    Request path: /handlers/forumalerts.ashx 
    User host address: 127.0.0.1 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: NT AUTHORITYNETWORK SERVICE 

Thread information: 
    Thread ID: 39 
    Thread account name: NT AUTHORITYNETWORK SERVICE 
    Is impersonating: True 
    Stack trace:    at System.Number.StringToNumber(String str, NumberStyles options, NumberBufferamp; number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at forumalerts.ProcessRequest(HttpContext context) in c:inetpubwwwrootScirraNewHandlersforumalerts.ashx:line 13
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Booleanamp; completedSynchronously)


Custom event details: 
  

Строка 13 — это первый запрос.форма:

 int TopicID = int.Parse(context.Request.Form["topicID"]);
  

Комментарии:

1. Что происходит, когда вы отправляете запрос со стороны клиента, например, с помощью jQuery? Кроме того, что происходит, когда вы отправляете запрос GET вместо запроса POST?

Ответ №1:

Первый шаг — прекратить использование Microsoft.XMLHTTP , вы не должны использовать это в сценарии базы служб. Вместо этого используйте MSXML2.ServerXMLHTTP.3.0 , который предназначен для использования в службах.

Кроме того, если .ashx, отправляемый inturn, перезванивает в исходное приложение ASP, тогда может возникнуть проблема с нехваткой потоков Gaby , на которую ссылается. Обычно вам это сойдет с рук на сайте с небольшим использованием. Однако, если в приложении включена отладка ASP, то обратный вызов приложения ASP определенно зависнет. Обратите внимание, что это не относится к простому сценарию ASP для ASHX.

Если ваша проблема не устранена (что, вероятно, так и будет), то:-

  • установите копию fiddler на свой компьютер.
  • Запустите скрипача
  • В командной строке введите >netsh
  • Выдача команды >winhttp set proxy 127.0.0.1:8888
  • Попытайтесь использовать свою страницу ASP, вы должны увидеть сообщение, захваченное fiddler
  • Восстановите настройки прокси winhttp с помощью >winhttp reset proxy

Теперь изучите запрос / ответ на сообщение в fiddler, это может дать некоторые подсказки относительно того, в чем заключается реальная проблема.

Ответ №2:

Если я правильно понимаю, вы делаете запрос на тот же сервер, что и вызывающий..

Читать http://support.microsoft.com/kb/316451

Не рекомендуется использовать объекты ServerXMLHTTP или WinHTTP для выполнения запросов протокола рекурсивной передачи гипертекста (HTTP) к тому же серверу Internet Information Server (IIS). Более конкретно, вызывающая страница активного сервера (ASP) не должна отправлять запросы ASP в тот же виртуальный каталог или в другой виртуальный каталог в том же пуле или процессе. Это может привести к снижению производительности из-за нехватки потоков.

Комментарии:

1. Я согласен, но, похоже, используется Microsoft.XMLHTTP , и, если я правильно помню XMLHTTP , построен на WinInet, а не на WinHTTP? Я также хочу узнать, можете ли вы помочь в этом.

2. Статья немного устарела, и ее использование фразы «тот же сервер IIS» является неудачным, поскольку оно вводит в заблуждение. В нем должно быть написано «то же приложение ASP». Это происходит только при обратном вызове в то же приложение ASP, где на самом деле возникает проблема нехватки потоков.

Ответ №3:

Я новичок в ASP classic.

Но, вероятно, запрошенная страница отправляет ответ на первую страницу и ожидает его получения, первая страница его не получает, поэтому возникает ошибка.

Попробуйте использовать следующее после objHttp.Send :

objHttp.ResponseText

О, только что нашел вероятную ошибку в этой строке:

objHttp.open "POST", strSiteRoot amp; "handlers/forumalerts.ashx?", false

Попробуйте использовать строку « handlers/forumalerts.ashx? » без «?» в конце.

Ответ №4:

Я заменил: Server.CreateObject("MSXML2.XMLHTTP") на Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")

и затем ошибка больше не появлялась.