Открыть / закрыть веб-сервис - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть Сервис.Мы отправляем записи в этот сервис.Однако, когда мы отправляем слишком много записей (3000), срок службы истекает.Моя идея состояла в том, чтобы разбить записи и открыть Сервис, а затем закрывать его каждые 1000 записей.

Однако я получаю сообщение об ошибке:

{"Cannot access a disposed object.\r\nObject name: 'System.ServiceModel.Channels.ServiceChannel'."}

Вот мой код:

ServiceClient client = new ServiceClient();
foreach (Record rc in creditTransactionList)
{
    //if we are not on the last one...
    if (currentTransCount < totalTransCount)
    {
        //Current batch count is less than 1,000
        if (currentBatchCount <= amountPerBatch)
        {
            currentBatchCount++;
            if (rc != null)
                client.RecordInsert(rc);
        }
        //Current batch count is 1,000
        if (currentBatchCount == amountPerBatch)
        {
            currentBatchCount = 0;
            client.Close();
            client.Open();
        }
        //Increment Total Counter by 1
        currentTransCount++;
    }
    else
    {
        currentBatchCount++;
        if (rc != null)
            client.RecordInsert(rc);
        client.Close();
    }
}

amountPerBatch = 1000;
totalTransCount = ACHTransactionList.Count();
currentBatchCount = 0;
currentTransCount = 1;

foreach (Record rc in ACHTransactionList)
{
    //if we are not on the last one...
    if (currentTransCount < totalTransCount)
    {
        //Current batch count is less than 1,000
        if (currentBatchCount <= amountPerBatch)
        {
            currentBatchCount++;
            if (rc != null)
                client.RecordInsert(rc);
        }
        //Current batch count is 1,000
        if (currentBatchCount == amountPerBatch)
        {
            currentBatchCount = 0;
            client.Close();
            client.Open();
        }
        //Increment Total Counter by 1
        currentTransCount++;
    }
    else
    {
        currentBatchCount++;
        if (rc != null)
            client.RecordInsert(rc);
        client.Close();
    }
}

Я создал пример консольного приложения, которое делает это, но когда я фактически включил его в реальный проект с реальным сервисом, я получил ошибку.Не могли бы вы помочь мне понять, что я делаю не так.Это должно быть мой client.open и client.close, это мое предположение.Любая помощь очень ценится!

Ответы [ 3 ]

8 голосов
/ 16 ноября 2011

Я бы попробовал что-то более подобное ... Обратите внимание, что вы всегда должны также .Dispose() клиент. Кроме того, если возникает ошибка, .Close() больше не работает на клиенте, вместо этого вам необходимо .Abort() it.

ServiceClient client = new ServiceClient();
try
{
  foreach(...)
  {
    ...
    //Current batch count is 1,000
    if (currentBatchCount == amountPerBatch)
    {
        currentBatchCount = 0;
        client.Close();
        client = new ServiceClient();
    }
    ...
  }
}
finally
{
  if(client.State == CommunicationState.Faulted)
    client.Abort();
  else
    client.Close();
}
1 голос
/ 16 ноября 2011

client.Close избавится от объекта.client.Open всегда будет выдавать ошибку после этого.Вам нужно инициализировать клиента с new ServiceClient();

0 голосов
/ 16 ноября 2011

Я проверяю состояние клиента и при необходимости сбрасываю его:

if (wsClient.State.Equals(CommunicationState.Faulted) || wsClient.State.Equals(CommunicationState.Closed) || wsClient.State.Equals(CommunicationState.Closing))
                {
                    wsClient = new ServiceClient();
                }
...