Почему вызов метода веб-службы истекает почти сразу?
В рабочей версии этого веб-сервиса, использующего.NET 1.1, такой проблемы нет. Это тестовая среда, в которой работает.NET 4.0 на Windows Server 2003.
У меня проблема, когда я получаю следующее исключение:
System.Net.WebException: The operation has timed out
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at HTP.RHIO.PIRManager.TargetWS.PIRService.Upload(Transmission t_request)
at HTP.RHIO.PIRManager.Manager.PIRManager.Upload(Transmission request)
Это происходит, когда метод Upload моего веб-сервиса вызывает метод Upload другого веб-сервиса. Тайм-аут наступает почти сразу, около 1/3 секунды (обратите внимание на столбец log_datetime)
Код: (Строка, в которой записывается интервал в выходных данных исключения, еще не реализована, поэтому она не отображается в выходных данных. Она должна переходить к значению по умолчанию interval = 60 [*1000])
int interval = 0;
try
{
try
{
interval = Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["RealTimeTimeOutSeconds"]);
}
catch(Exception ex)
{
interval = 60;
}
interval = interval * 1000;
target.Timeout = interval;
trans = target.Upload(trans);
}
catch(System.Net.WebException ex)
{
request.TransmissionHeader.MessageCode = GetReturnMessageCode(ex);
request.TransmissionHeader.Message = ex.Message;
Log(request.TransmissionHeader, "Upload", "FAILED", "(Timeout = " + interval.ToString() + ") " + ex.ToString(), 1);
trans = TA1forFailedRealtimeUpload(trans.TransmissionHeader);
request = ConvertToLocal(trans, request);
Log(request.TransmissionHeader, "Upload", "SENDING", "Responding to sender with TA1", 1);
return request;
}
}
и из файла web.config моего веб-сервиса:
<httpRuntime executionTimeout="600" maxRequestLength="2000000"/>
1 ответ
Convert.ToInt16
может не делать то, что вы ожидаете. Из руководства;
Возвращаемое значение
Тип: System.Int16
16-разрядное целое число со знаком, эквивалентное числу в значении, или 0 (ноль), если значение равно нулю.
Если RealTimeTimeOutSeconds
не установлен в вашей конфигурации, вы будете преобразовывать NULL, что приведет к нулевому таймауту.