SignalR мешает другому контроллеру - PullRequest
0 голосов
/ 27 июня 2018

Как только я подключаю SignalR к приложению с помощью Install-package Microsoft.AspNetCore.SignalR , немедленно перестает работать метод POST одного из контроллеров. Без сигнала все работает нормально. Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(configuration.GetConnectionString("DefaultConnection")));

    var section = configuration.GetSection("AppSettings");
    var settings = section.Get<AppSettings>();

    services.Configure<AppSettings>(section);

    var builder = services.AddIdentityCore<ApplicationUser>(user =>
    {
        user.Password.RequireDigit = true;
        user.Password.RequireLowercase = false;
        user.Password.RequireUppercase = false;
        user.Password.RequireNonAlphanumeric = false;
        user.Password.RequiredLength = 6;
    });

    builder = new IdentityBuilder(builder.UserType, typeof(IdentityRole), builder.Services);
    builder.AddSignInManager<SignInManager<ApplicationUser>>();
    builder.AddRoleValidator<RoleValidator<IdentityRole>>();
    builder.AddRoleManager<RoleManager<IdentityRole>>();
    builder.AddEntityFrameworkStores<ApplicationDbContext>();
    builder.AddDefaultTokenProviders();

    services.AddCors(options => options.AddPolicy("CorsPolicy", policy =>
    {
        policy
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowAnyOrigin()
            .AllowCredentials();
    }));

    services.AddSignalR();
    services.AddOData();
    services.AddMvc();

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = settings.issuer,
                    ValidAudience = settings.issuer,
                    IssuerSigningKey = JwtSecurityKey.Create(settings.key)
                };

                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        if (context.Request.Path.Value.StartsWith("/chatHub") &&
                            context.Request.Query.TryGetValue("token", out StringValues token)
                        )
                        {
                            context.Token = token;
                        }

                        return Task.CompletedTask;
                    },
                    OnAuthenticationFailed = context =>
                    {
                        Console.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);
                        return Task.CompletedTask;
                    },
                    OnTokenValidated = context =>
                    {
                        Console.WriteLine("OnTokenValidated: " + context.SecurityToken);
                        return Task.CompletedTask;
                    }
                };
            });

    services.AddAuthorization(options =>
    {
        options.AddPolicy("user", policy => policy.RequireClaim("id"));
    });

    services.AddSingleton<ISendGridClient, SendGridClient>(serviceProvider =>
    {
        return new SendGridClient(settings.sendGridKey);
    });

    services.AddSingleton<ILogger>(serviceProvider =>
    {
        return loggerFactory.CreateLogger("logger");
    });

    services.AddSingleton<IEmailSender, EmailSender>();
    services.AddSingleton<IUploader, Uploader>();

}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseAuthentication();
    app.UseCors("CorsPolicy");

    app.UseSignalR(routes =>
    {
        routes.MapHub<SignalRHub>("/chatHub");
    });

    app.UseMvc(routebuilder =>
    {
        routebuilder.MapRoute(name: "DefaultApi", template: "api/{controller=Home}/{action=Index}/{id?}");
    });
}

Контроллер:

[Authorize(Policy = "user")]
public class UserFilesController : Controller
{
    [HttpPost]
    public async Task<IActionResult> SaveAvatar(AvatarModel avatar)
    {
        // Some code here, here the call does not even come
    }
}

Звонок в JavaScript

$.ajax({
    method: 'POST',
    url: serviceUrl + 'api/userfiles/saveavatar',
    data: data,
    headers: getHeaders()
}).done(function (UploadResult) {
    // some code here
});

enter image description here

...