2016-12-08 6 views
3

Я тестирую ядро ​​.net и создаю небольшое примерное приложение с использованием .net core + websockets, чтобы вставлять некоторые данные в мое приложение. Я хочу сохранить эти данные в базе данных с помощью dbcontext..net core websockets получить DbContext

Однако у меня возникают проблемы с получением dbcontext в моем обработчике websocket. Итак, как я могу создать dbcontext для использования.

Мой метод запуска Настройка содержит следующее:

... 
app.Map("/ws", WSHandler.Map); 
... 

Это мой класс WSHandler, который реализует собственно чтение из входящего соединения. Мне нужен DbContext здесь, который я могу использовать для чтения/записи из базы данных.

/// <summary> 
/// Handler for an incoming websocket client 
/// </summary> 
public class WSHandler { 
    /// <summary> 
    /// Max size in bytes of an incoming/outgoing message 
    /// </summary> 
    public const int BufferSize = 4096; 

    /// <summary> 
    /// The socket of the current connection 
    /// </summary> 
    WebSocket socket; 

    /// <summary> 
    /// Constructor, assign socket to current instance and adds socket to ConnectedClients. 
    /// </summary> 
    /// <param name="socket"></param> 
    WSHandler(WebSocket socket) { 
     this.socket = socket; 
    } 

    /// <summary> 
    /// Configure app to use websockets and register handler. 
    /// </summary> 
    /// <param name="app"></param> 
    public static void Map(IApplicationBuilder app) { 
     app.UseWebSockets(); 
     app.Use((WSHandler.Acceptor); 
    } 

    /// <summary> 
    /// Accept HttpContext and handles constructs instance of WSHandler. 
    /// </summary> 
    /// <param name="hc">The HttpContext</param> 
    /// <param name="n">Task n</param> 
    /// <returns></returns> 
    static async Task Acceptor(HttpContext hc, Func<Task> n) { 
     if (hc.WebSockets.IsWebSocketRequest == false) { 
      return; 
     } 

     var socket = await hc.WebSockets.AcceptWebSocketAsync(); 
     var h = new WSHandler(socket); 
     await h.Loop(); 
    } 

    /// <summary> 
    /// Wait's for incoming messages 
    /// </summary> 
    /// <returns></returns> 
    async Task Loop() { 
     var buffer = new Byte[BufferSize]; 
     ArraySegment<Byte> segment = new ArraySegment<byte>(buffer); 
     while (this.socket.State == WebSocketState.Open) { 
      WebSocketReceiveResult result = null; 
      do { 
       result = await socket.ReceiveAsync(segment, CancellationToken.None); 
      } while (result.EndOfMessage == false); 

      // do something with message here. I want to save parse and save to database 
     } 

    } 
} 
+0

Привет, @ Джон Смит. Вы разрешили эту проблему? Я ищу решение сейчас – Mergasov

+0

@Mergasov да позвольте мне перейти к коду, и я отправлю ответ. –

ответ

2

Поскольку в этом посте есть некоторые интересы, я добавил решение, которое использовал.

У вас есть доступ ко всем услугам через HttpContext. Так что я сделал, это получить параметры контекста из этой службы, а затем создать контекст, когда они мне нужны. Имейте в виду, что этот длинный жизненный контекст не рекомендуется, и если возникает ошибка, DbContext больше не используется. В итоге я реализовал другой уровень кэширования базы данных и написал для этого вместо того, чтобы использовать сам DbContext в обработчике websocket.

Вот расширенный код для создания DbContexts. Я не тестировал его, так как прямо сейчас у меня нет визуальной студии ...

<summary> 
/// Handler for an incoming websocket client 
/// </summary> 
public class WSHandler { 
    /// <summary> 
    /// Max size in bytes of an incoming/outgoing message 
    /// </summary> 
    public const int BufferSize = 4096; 

    /// <summary> 
    /// The socket of the current connection 
    /// </summary> 
    WebSocket socket; 

    /// <summary> 
    /// The options to create DbContexts with. 
    /// </summary> 
    DbContextOptions<AssemblyServerContext> ctxOpts; 

    /// <summary> 
    /// Constructor, assign socket to current instance and adds socket to ConnectedClients. 
    /// </summary> 
    /// <param name="socket"></param> 
    /// <param name="ctxOpts"></param> 
    WSHandler(WebSocket socket, DbContextOptions<AssemblyServerContext> ctxOpts) { 
     this.ctxOpts = ctxOpts; 
     this.socket = socket; 
    } 

    /// <summary> 
    /// Configure app to use websockets and register handler. 
    /// </summary> 
    /// <param name="app"></param> 
    public static void Map(IApplicationBuilder app) { 
     app.UseWebSockets(); 
     app.Use((WSHandler.Acceptor); 
    } 

    /// <summary> 
    /// Accept HttpContext and handles constructs instance of WSHandler. 
    /// </summary> 
    /// <param name="hc">The HttpContext</param> 
    /// <param name="n">Task n</param> 
    /// <returns></returns> 
    static async Task Acceptor(HttpContext hc, Func<Task> n) { 
     if (hc.WebSockets.IsWebSocketRequest == false) { 
      return; 
     } 

     var socket = await hc.WebSockets.AcceptWebSocketAsync(); 
     var ctxOptions = hc.RequestServices.GetService<DbContextOptions<AssemblyServerContext>>(); 
     var h = new WSHandler(socket, ctxOptions); 
     await h.Loop(); 
    } 

    /// <summary> 
    /// Wait's for incoming messages 
    /// </summary> 
    /// <returns></returns> 
    async Task Loop() { 
     var buffer = new Byte[BufferSize]; 
     ArraySegment<Byte> segment = new ArraySegment<byte>(buffer); 
     while (this.socket.State == WebSocketState.Open) { 
      WebSocketReceiveResult result = null; 
      do { 
       result = await socket.ReceiveAsync(segment, CancellationToken.None); 
      } while (result.EndOfMessage == false); 

      // do something with message here. I want to save parse and save to database 
      using (var ctx = new AssemblyServerContext(ctxOpts)) { 

      } 
     } 

    } 
} 
+0

благодарю за это, моя ночь сохранена) – Mergasov

Смежные вопросы