Проблема с SignalR Core и SqlDependency - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь заставить довольно простую реализацию SignalR Core работать в моем веб-приложении.В моем решении у меня есть концентратор и файл запуска.Вот что у меня есть.

Startup.cs

    using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Data.SqlClient;

namespace RatingSignalR
{
  public class Startup
  {
    public Startup(IConfiguration configuration, ILogger logger)
    {
      Configuration = configuration;
      Logger = logger;
    }

    public IConfiguration Configuration { get; }
    public ILogger Logger { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
      {
        builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
      }));
      services
        .AddSignalR(options =>
        {
          options.EnableDetailedErrors = true;
        });
      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
      string connStr = System.Configuration.ConfigurationManager.AppSettings["connRackley"];
      SqlDependency.Start(connStr);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      try
      {
        if (env.IsDevelopment())
        {
          app.UseDeveloperExceptionPage();
        }

        app.UseCors("CorsPolicy");

        app.UseSignalR(builder =>
        {
          builder.MapHub<RatingSignalRHub>("ratingsignalrhub");
        });

        app.UseMvc();
      }
      catch (System.Exception e)
      {
        Logger.LogError(e.Message);
      }

    }
  }
}

RatingSignalRHub.cs

using Microsoft.AspNetCore.SignalR;
using System.Data.SqlClient;

namespace RatingSignalR
{
  public class RatingSignalRHub : Hub
  {
    public void FetchComparisons()
    {
      Clients.All.SendAsync("FetchComparisons");
    }

    void OnChange(object sender, SqlNotificationEventArgs e)
    {
      SqlDependency dep = sender as SqlDependency;
      dep.OnChange -= OnChange;
      if (e.Info != SqlNotificationInfo.Error && e.Info != SqlNotificationInfo.Delete)
      {
        FetchComparisons();
      }
    }

    void GetComparisons()
    {
      string connStr = System.Configuration.ConfigurationManager.AppSettings["connRackley"];
      SqlConnection conn = new SqlConnection(connStr);
      conn.Open();
      // do stuff
      SqlCommand cmd = new SqlCommand("uspGetPAComparisons", conn)
      {
        Notification = null
      };
      SqlDependency dep = new SqlDependency(cmd);
      dep.OnChange += new OnChangeEventHandler(OnChange);

      if (conn.State == System.Data.ConnectionState.Closed)
      {
        conn.Open();
      }
      cmd.ExecuteReader();
      conn.Close();
    }
  }
}

ЕслиЯ удаляю SqlDependency.Start(connStr) из автозагрузки, все отлично работает.Однако добавление этой строки вызывает следующее сообщение об ошибке: Ошибка SignalR (извините, пока нельзя встраивать изображения).

Есть ли у кого-нибудь какие-либо предложения относительно того, почему добавление метода запуска SqlDependency являетсявызывая это?Заранее спасибо.

...