Где запустить асинхронный метод в службе Asp Net Core - PullRequest
0 голосов
/ 25 июня 2018

У меня есть служба, которая должна поддерживать прямое соединение с базой данных. Это соединение должно создаваться перед любым клиентским запросом.

Поскольку API базы данных предоставляет асинхронный метод для подключения к нему, где это возможноя подключаюсь к базе данных до того, как будет выдан какой-либо запрос?

SocketMiddleware :

class SocketMiddleware
    {
        Handler handler;
        public SocketMiddleware(Handler _handler,RequestDelegate del)
        {
            this.handler = _handler;
            this.next = del;
        }

        RequestDelegate next;

        public async Task Invoke(HttpContext context)
        {

            if (!context.WebSockets.IsWebSocketRequest)
            {
                await  this.next(context);
                return;
            }
            await this.handler.AddClientAsync(context.WebSockets);

        }
    }

Служба , использующая прямое RethinkDB соединение:

 class Handler
        {

            private readonly RethinkDB r;
            public  Connection Con { get; private set; }

            private ConcurrentDictionary<string, Client> clients = new ConcurrentDictionary<string, Client>();
            private object Lock = new object();

            public Handler()
            {
                this.r = new RethinkDB();
               //I have to instnatiate --- this.Con = this.r.Connection().Port(Constants.RETHINK_PORT).Hostname(Constants.HOST_NAME).ConnectAsync();
            }
              ///////////////////////////---Where can i run the below method?
            public async Task ConnectRethinkAsync()
            {
                using (Process proc = new Process())
                {
                    proc.StartInfo = new ProcessStartInfo(Constants.RETHINK_PROCESS_PATH);
                    proc.Start();


                    this.Con = await this.r.Connection().Port(Constants.RETHINK_PORT).Hostname(Constants.HOST_NAME).ConnectAsync();
                }

            }
            public async Task AddClientAsync(WebSocketManager manager)
            {
                WebSocket clientSocket = await manager.AcceptWebSocketAsync();
                string clientID = Ext.MakeId();
                using (Client newClient = Client.Create(clientSocket, clientID))
                {

                    while (true)
                    {
                        if (!newClient.KeepAlive)
                        {
                            break;
                        }
                        ReadOnlyMemory<byte>received = await newClient.ReceiveAsync();
                        string toSend =  $"From Server:\r\nDate:{DateTime.Now.ToString()},WasReceived:{Encoding.UTF8.GetString(received.ToArray())}\r\nEnd of Message\r\n";
                       // await r.Db(Constants.DB_NAME).Table(Constants.TABLE_NAME).RunAsync(this.Con);
                        await newClient.SendAsync(toSend);
                    }
                }



            }
            public bool RemoveClient(string ID)
            {
                if (this.clients.TryRemove(ID, out Client value))
                {
                    value.Dispose();
                    return true;
                }
                return false;

            }

        }

PS: В приведенном выше фрагменте наиболее важной является строка с комментарием: мне нужно создать экземпляр Connection , который является асинхронной операцией.
Я не могуинстанцировать его в Handler ctor или в SocketMiddleware ctor.
Con должен быть инициализирован перед выполнением любого запроса. (в нашем случае - AddClientAsync вызывается) Если соединение с базой данных будет выполненов другом сервисе?

1 Ответ

0 голосов
/ 26 июня 2018

Поскольку вы уже защитили соединение, которое будет установлено извне, вы можете установить соединение в AddClientAsync, например:

if(this.Con == null)
{
    this.Con = await this.r.Connection()
           .Port(Constants.RETHINK_PORT)
           .Hostname(Constants.HOST_NAME)
           .ConnectAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...