Не удается получить доступ к удаленному объекту: DataContext - PullRequest
0 голосов
/ 04 января 2019

Я использую TCPClient для подключения к устройству и получения некоторых данных в виде строк, затем я пытаюсь сохранить данные в БД и получаю

«Невозможно получить доступ к удаленному объекту»ошибка. "

Может быть проблема в том, что я пытаюсь сохранить в БД функцию асинхронного обратного вызова? Пожалуйста, посмотрите, вот две функции: первая получает сетевой поток, уже подключенный к устройствуи начинает чтение данных, второй - обратный вызов:

private void ReadDataAsync(NetworkStream nwStream)
        {
            byte[] buffer = new byte[1024];

            messageStream mStream = new messageStream(nwStream, buffer);

            if (nwStream.CanRead)
            {
                Console.WriteLine("Starting async");
                nwStream.BeginRead(buffer, 0, buffer.Length,
                    new AsyncCallback(OnReadEndAsync), mStream);
            }

            else
            {
                Console.WriteLine("Cannot read stream");
            }
        }

        private void OnReadEndAsync(IAsyncResult result)
        {
            String message = "";

            messageStream mStream = (messageStream)result.AsyncState;
            int incDataSize = mStream.nwStream.EndRead(result);

            message = Encoding.ASCII.GetString(mStream.buffer, 0, incDataSize);
            List<Event> events = new List<Event>();
            events = ProcessMessage(message);
            if(events.Any())
                 _repo.saveEventsToDB(events);
            if (mStream.nwStream.CanRead)
            {
                mStream.nwStream.BeginRead(mStream.buffer, 0, mStream.buffer.Length,
                    new AsyncCallback(OnReadEndAsync), mStream);
            }
        }

1 Ответ

0 голосов
/ 04 февраля 2019

Наконец-то нашли решение!

Так что проблема заключалась в том, что я использовал зависимость DataContext, которая была введена в конструктор контроллера - и была удалена после завершения HTTP-запроса.

Таким образом, решение заключается в том, чтобы вручную ввести зависимость в саму функцию, которой требуется доступ к базе данных:

  1. Вставить фабрику области видимости IServiceScopeFactory scopeFactory в конструктор контроллера.

  2. Добавьте это к моей функции, где мне нужен доступ к DBcontext:

    использование (var scope = _scopeFactory.CreateScope ()) { var context = scope.ServiceProvider.GetRequiredService (); ... }

...