В моем понимании синхронизировано в основном означает, что компилятор пишет monitor.enter и monitor.exit вокруг вашего метода. Как таковой он может быть потокобезопасным в зависимости от того, как он используется (я имею в виду, что вы можете написать объект с синхронизированными методами, который не является потокобезопасным в зависимости от того, что делает ваш класс).
Вы правы, что проверка с помощью ping-запросов сервера не достаточна. Сервер может возрасти, но веб-сервис, недоступный из-за многих причин.
Для контроля наших соединений веб-сервиса я создал интерфейс IMonitoredService, который имеет метод CheckService (). Класс обертки для каждого веб-сервиса реализует этот метод для вызова безвредного метода на веб-сервисе и отчетов, если сервис закончился или нет. Это позволяет любому номеру служб контролироваться с кодом, ответственным за контроль, зная детали сервиса.
, Если Вы знаете немного о том, что веб-сервис возвратит из доступа к URL непосредственно, Вы могли попытаться просто использовать URL. Например, asmx файл Microsoft возвращает сводку веб-сервиса. Другие реализации могут вести себя по-другому все же.
Подсказка: создайте интерфейс/базовый класс с методом "InvokeWithSomeParameters". Значение "SomeParameters" должно быть "параметрами, который 100% не влияет ни на какое важное состояние".
я думаю, существует 2 случая:
я не думаю, это - самое ясное решение, но оно должно работы.
Как насчет того, чтобы открытие соединение TCP/IP с портом используется веб-сервисом? Если соединение работает, соединение RAS, остальная часть сети и хоста все работает. Веб-сервис почти наверняка работает также.
Вы можете попробовать следующее, чтобы проверить существование веб-сайта:
public static bool ServiceExists(
string url,
bool throwExceptions,
out string errorMessage)
{
try
{
errorMessage = string.Empty;
// try accessing the web service directly via it's URL
HttpWebRequest request =
WebRequest.Create(url) as HttpWebRequest;
request.Timeout = 30000;
using (HttpWebResponse response =
request.GetResponse() as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception("Error locating web service");
}
// try getting the WSDL?
// asmx lets you put "?wsdl" to make sure the URL is a web service
// could parse and validate WSDL here
}
catch (WebException ex)
{
// decompose 400- codes here if you like
errorMessage =
string.Format("Error testing connection to web service at" +
" \"{0}\":\r\n{1}", url, ex);
Trace.TraceError(errorMessage);
if (throwExceptions)
throw new Exception(errorMessage, ex);
}
catch (Exception ex)
{
errorMessage =
string.Format("Error testing connection to web service at " +
"\"{0}\":\r\n{1}", url, ex);
Trace.TraceError(errorMessage);
if (throwExceptions)
throw new Exception(errorMessage, ex);
return false;
}
return true;
}