Снова используйте клиентский класс в WCF после того, как он будет дан сбой

found:{} - это метка в Java, в основном используемая для оператора goto, но поскольку Java не использует goto, ее можно использовать для оператора break и continue. Вот пример использования метки в Java.

    loop: 
    for (int i = 0; i < 10; i++) { 
        for(int j=0; j<10; j++)
        {
            if(j==5)
            {
                break loop;
            }
            System.out.println(j);
        }

    } 

Когда j достигнет 5, произойдет разрыв на внешнюю метку loop.

9
задан Andy 1 May 2009 в 12:17
поделиться

4 ответа

Согласитесь с последними ответами, если не получилось, нужно прервать. Для этого мы используем комбинацию лямбда-выражений и метод, подобный следующему:

  public static void Use<TServiceInterface>(TServiceInterface proxy, Action handler)
  {
     Type proxyType = typeof(TServiceInterface);
     IClientChannel channel = (IClientChannel)proxy;

     try
     {
        handler();

        _logSource.Log(LogLevel.Debug, string.Format("Closing client channel for '{0}' ...", proxyType.Name));

        channel.Close();

        _logSource.Log(LogLevel.Debug, string.Format("Client channel for '{0}' closed.", proxyType.Name));
     }
     catch
     {
        if (channel.State == CommunicationState.Faulted)
        {
           _logSource.Log(LogLevel.Debug, string.Format("Aborting client channel for '{0}' ...", proxyType.Name));

           channel.Abort();

           _logSource.Log(LogLevel.Debug, string.Format("Client channel for '{0}' aborted.", proxyType.Name));
        }
        else
        {
           _logSource.Log(LogLevel.Debug, string.Format("Closing client channel for '{0}' ...", proxyType.Name));

           channel.Close();

           _logSource.Log(LogLevel.Debug, string.Format("Client channel for '{0}' closed.", proxyType.Name));
        }

        throw;
     }
  }

Это небольшая модификация решения, которое уже есть в .net, но оно отлично подходит для работы с прокси. Затем вы можете поместить несколько вызовов службы в одно и то же лямбда-выражение и передать его в метод.

4
ответ дан 4 December 2019 в 08:34
поделиться

Это, скорее всего, вызвано необработанным исключением на стороне сервера. По умолчанию среда выполнения WCF завершает работу вашего экземпляра службы и переводит канал в состояние отказа в случае необработанного исключения, и вы больше не можете общаться по этому каналу. Поэтому вам нужно будет установить новый сеанс с сервисом. Вы должны перехватывать исключения на стороне сервера и отправлять мыльные ошибки, вызывая FaultException или определяя FaultContract. Существует также поведение сервиса returnUnknownExceptionsAsFaults, которое вы можете использовать.

По умолчанию среда выполнения WCF завершает работу вашего экземпляра службы и переводит канал в состояние отказа в случае необработанного исключения, и вы больше не можете общаться по этому каналу. Поэтому вам нужно будет установить новый сеанс с сервисом. Вы должны перехватывать исключения на стороне сервера и отправлять мыльные ошибки, вызывая FaultException или определяя FaultContract. Существует также поведение сервиса returnUnknownExceptionsAsFaults, которое вы можете использовать.

По умолчанию среда выполнения WCF завершает работу вашего экземпляра службы и переводит канал в состояние отказа в случае необработанного исключения, и вы больше не можете общаться по этому каналу. Поэтому вам нужно будет установить новый сеанс с сервисом. Вы должны перехватывать исключения на стороне сервера и отправлять мыльные ошибки, вызывая FaultException или определяя FaultContract. Существует также поведение сервиса returnUnknownExceptionsAsFaults, которое вы можете использовать.

0
ответ дан 4 December 2019 в 08:34
поделиться

Как только объект ICommunicationObject (ваш клиентский объект WCF) находится в неисправном состоянии, единственный способ «вновь открыть» его является создание нового.

ServiceClient client = new ServiceClient();
try
{
    client.Operation1();
}
catch(Exception ex)
{
    if (client.State == CommunicationState.Faulted)
    {
            client.Abort();
            client = new ServiceClient();
    }
}
try
{
    client.Operation2();
}
catch(Exception ex)
{
   // Handle Exception
}
16
ответ дан 4 December 2019 в 08:34
поделиться

Команда

:%s/<Ctrl-V><Ctrl-M>/\r/g

Где означает тип Ctrl + V , затем Ctrl + M .

Объяснение

:%s

подставить,% = все строки

<Ctrl-V><Ctrl-M>

^ M символов (Ctrl-V - это способ записи символа Ctrl ^ в Vim, а Ctrl-M записывает M после регулярного выражения, в результате чего получается ^ M специальный символ)

/\r/

с новой строкой ( \ r )

g

И сделать это глобально (не только первое вхождение в строке).

В вашем примере я, вероятно, сделал бы что-то вроде:

if (client.State == CommunicationState.Faulted)
    client = new ServiceClient();

Это позволило бы вам «заново открыть» соединение, если оно повреждено. Это может показаться немного излишним, но если вы получаете коммуникационное исключение на стороне клиента, вероятно, происходит что-то еще (например: сервер мертв? Сервер не отвечает?)

Удачи

5
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: