Время ожидания вызова веб-службы CLR истекает через 100 секунд

#sql #timeout #clr #webrequest

#sql #тайм-аут #clr #веб-запрос

Вопрос:

Я нигде не нашел ответа на этот вопрос. У меня есть функция CLR, которая выполняет вызов веб-метода моего приложения .NET (.asmx). Веб-служба успешно выполняется при прямом вызове, но при вызове через среду CLR время ожидания истекает через 100 секунд со следующей ошибкой:

 Msg 6522, Level 16, State 1, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "fn_ExecuteReport":
System.Net.WebException: The operation has timed out
System.Net.WebException:
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at DD.WebServices.WebExec.ExecuteReport(String ddBotID, String serverKey, Int32 ddUserID, String reportReportTypeList, String deliverToUserList)
   at ExecuteReport.GetResult(Int32 userID, SqlString reportList, SqlString deliverToUserList)
  

Я увеличил время ожидания прокси-сервера веб-службы в fn_ExecuteReport без эффекта:

 WebExec svc = new WebExec();<br/>
svc.Timeout = 3600000;  // set timeout to 1 hour<br/>
result = svc.ExecuteReport(userID, reportTypeList.ToString(),
                           deliverToUserList.ToString());
  

Я хочу зафиксировать возвращаемый результат, поэтому асинхронное выполнение веб-сервиса не является решением. Где еще я мог бы переопределить настройки тайм-аута для вызова SQL CLR? Спасибо за любую помощь, которую вы можете предоставить.

Вот код для функции. Я могу запустить веб-сервис, время ожидания возникает только при выполнении через CLR.

 ALTER FUNCTION [dbo].[fn_ExecuteReport]
(@UserID int, @ReportTypeList nvarchar(max), @DeliverToUserList nvarchar(max)) 
RETURNS [nvarchar](255) 
WITH EXECUTE AS CALLER AS EXTERNAL NAME [MyCLRLib].[ExecuteReport].[GetResult] 
  

Я пробовал как синхронные, так и асинхронные вызовы веб-службы в функции CLR, и оба заканчиваются 100-секундным таймаутом. Вот оба вызова, которые я пробовал:

Синхронно:
WebExec svc = new WebExec(); svc.Timeout = 3600000; // установить время ожидания равным 1 часу результат = svc.ExecuteReport(идентификатор пользователя, список типов отчетов.toString(), deliverToUserList.toString());

Асинхронный:
WebExec svc = new WebExec();
Результат IAsyncResult = svc.BeginExecuteReport(идентификатор пользователя, тип отчета).toString(), deliverToUserList.toString(), null, нуль);
результат.AsyncWaitHandle.WaitOne();
retStr = svc.EndExecuteReport(результат);

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

1. это всего лишь заглушка для функции. Как насчет публикации кода…

2. Я добавил внутренности функции выше. Я безуспешно пытался вызвать веб-службу как sync, так и async. Спасибо, что посмотрели.

3. «Я добавил внутренности функции выше» — где?

4. Два раздела выше, помеченные как «Синхронный» и «Асинхронный», являются внутренностями моего класса c # «ExecuteReport», который вызывает заглушка. Первый — это вызов синхронизации, поэтому я попытался изменить его на асинхронный вызов, но время ожидания CLR все еще истекает через 100 секунд, так что время ожидания истекает не в этом коде. Функция CLR должна выполнить веб-запрос для извлечения данных веб-сервиса, и, похоже, время ожидания этого веб-запроса истекло. Я не уверен, как / где генерируется этот код извлечения.

5. По нескольким причинам (одной из которых является проблема с таймаутом) Я решил создать небольшое консольное приложение для запуска веб-службы, а не использовать SQL CLR. Я все еще хотел бы знать, как вызывать длительные вызовы веб-службы через SQL CLR, поэтому я куплю пива для любого, кто может мне рассказать.

Ответ №1:

В вашем сообщении об ошибке предполагается, что тайм-аут возникает на SQL Server.

Вы пробовали обновлять статистику вашего SQL Server (или перестраивать индексы)?

Можете ли вы опубликовать код вашей функции CLR?

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

1. Спасибо за ответ. Вот код для функции … в нем не так много. Опять же, я могу запустить веб-сервис, время ожидания возникает только при выполнении через CLR. ИЗМЕНИТЬ ФУНКЦИЮ [dbo]. [fn_ExecuteReport] (@userId [int], @ReportTypeList [nvarchar] (макс.), @DeliverToUserList [nvarchar](макс.)) ВОЗВРАЩАЕТ [nvarchar](255) С ИМЕНЕМ EXECUTE AS CALLER В качестве ВНЕШНЕГО ИМЕНИ [MyCLRLib]. [Отчет исполнителя]. [GetResult]