I have a job that periodically does some work involving ServerXmlHttpRquestto perform an HTTP POST. The job runs every 60 seconds.
And normally it runs without issue. But there's about a 1 in 50,000 chance (every two or three months) that it will hang:
IXMLHttpRequest http = new ServerXmlHttpRequest(); http.open("POST", deleteUrl, false, "", ""); http.send(stuffToDelete); <---hang
When it hangs, not even the Task Scheduler (with the option enabled to kill the job if it takes longer than 3 minutes to run) can end the task. I have to connect to the remote customer's network, get on the server, and use Task Manager to kill the process.
And then its good for another month or three.
Eventually i started using Task Manager to create a process dump,
so i could analyze where the hang is. After five crash dumps (over the last 11 months or so) i get a consistent picture:
ntdll.dll!_NtWaitForMultipleObjects@20() KERNELBASE.dll!_WaitForMultipleObjectsEx@20() user32.dll!MsgWaitForMultipleObjectsEx() user32.dll!_MsgWaitForMultipleObjects@20() urlmon.dll!CTransaction::CompleteOperation(int fNested) Line 2496 urlmon.dll!CTransaction::StartEx(IUri * pIUri, IInternetProtocolSink * pOInetProtSink, IInternetBindInfo * pOInetBindInfo, unsigned long grfOptions, unsigned long dwReserved) Line 4453 C++ urlmon.dll!CTransaction::Start(const wchar_t * pwzURL, IInternetProtocolSink * pOInetProtSink, IInternetBindInfo * pOInetBindInfo, unsigned long grfOptions, unsigned long dwReserved) Line 4515 C++ msxml3.dll!URLMONRequest::send() msxml3.dll!XMLHttp::send() Contoso.exe!FrobImporter.TFrobImporter.DeleteFrobs Line 971 Contoso.exe!FrobImporter.TFrobImporter.ImportCore Line 1583 Contoso.exe!FrobImporter.TFrobImporter.RunImport Line 1070 Contoso.exe!CommandLineProcessor.TCommandLineProcessor.HandleFrobImport Line 433 Contoso.exe!CommandLineProcessor.TCommandLineProcessor.CoreExecute Line 71 Contoso.exe!CommandLineProcessor.TCommandLineProcessor.Execute Line 84 Contoso.exe!Contoso.Contoso Line 167 kernel32.dll!@BaseThreadInitThunk@12() ntdll.dll!__RtlUserThreadStart() ntdll.dll!__RtlUserThreadStart@8()
So i do a ServerXmlHttpRequest.send, and it never returns. It will sit there for days (causing
the system to miss financial transactions, until come Sunday night i get a call that it's broken).
It is of no help unless someone knows how to debug code, but the registers in the stalled thread at the time of the dump are:
EAX 00000030 EBX 00000000 ECX 00000000 EDX 00000000 ESI 002CAC08 EDI 00000001 EIP 732A08A7 ESP 0018F684 EBP 0018F6C8 EFL 00000000
- Windows Server 2012 R2
- Microsoft IIS/8.5
- Process crash dumps available
Default timeouts of ServerXmlHttpRequest
You can use serverXmlHttpRequest.setTimeouts(...) to configure the four classes of timeouts:
- resolveTimeout: The value is applied to mapping host names (such as "www.microsoft.com") to IP addresses; the default value isinfinite, meaning no timeout.
- connectTimeout: A long integer. The value is applied to establishing a communication socket with the target server, with a default timeout value of60 seconds.
- sendTimeout: The value applies to sending an individual packet of request data (if any) on the communication socket to the target server. A large request sent to a server will normally be broken up into multiple packets; the send timeout
applies to sending each packet individually. The default value is 30 seconds.
- receiveTimeout: The value applies to receiving a packet of response data from the target server. Large responses will be broken up into multiple packets; the receive timeout applies to fetching each packet of data off the socket. The default
value is 30 seconds.
The KB305053 (a server that decides to keep the connection open will cause serverXmlHttpRequest to wait for the connection to close) seems like it plausibly could be the issue. But the 30 second default timeout would have taken care of that.
Bonus Reading
-
Stacknbsp;
- KB305053: ServerXMLHTTP Stops Responding When You Send a POST Request (which says the timeout should expire; where mine does not)
-
MS Forums: oHttp.Send - Hangs (HEAD, not POST)
-
MS Forums: ASP to test SOAP WebService using MSXML2.ServerXMLHTTP Send hangs