#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")
и затем ошибка больше не появлялась.