Добавить класс запуска в библиотеку классов .Net Core

#c# #asp.net-core #signalr #signalr-hub

#c# #asp.net-core #signalr #signalr-концентратор

Вопрос:

Я пытаюсь добавить класс запуска OWIN в новый проект библиотеки классов .Net core. Я установил пакет Microsoft.AspNetCore.Пакет Owin. Но я все еще не вижу возможности создать класс запуска OWIN в мастере добавления новых элементов. Раньше это было в .Библиотека классов Net ранее. Отличается ли это в библиотеке классов .Net Core?

По сути, я хочу создать отдельный проект для моего SingalR hub и использовать его, где захочу, просто ссылаясь на него.

Комментарии:

1. Шаблоны отличаются в зависимости от типа проекта. Я думаю, что запуск OWIN происходит только в ASP.NET Основной проект. Вы можете создать класс в ASP.NET Основной проект и скопировать / вставить в проект библиотеки.

2. Я могу скопировать класс из веб-проекта в проект библиотеки, но будет ли выполняться?

3. Почему вы хотите использовать OWIN и не используете ASP.net ядро, которое имеет хорошо спроектированную инфраструктуру промежуточного программного обеспечения?

4. @Peter Как тогда я могу настроить службы SignalR в проекте библиотеки классов? Все учебные пособия просто показывают добавление в веб-проект, а службы настраиваются в классе startup.

Ответ №1:

Это связано с инструментарием Visual Studio. Когда вы работаете над веб-проектом, Visual Studio распознает это и представляет веб-параметры в мастере добавления новых элементов. Поскольку вы работаете в проекте библиотеки классов, Visual Studio не считает, что вам нужны веб-опции, и поэтому не представляет их. К счастью, класс startup, который вам нужен, является простым классом с некоторыми соглашениями. Вы должны иметь возможность добавить класс с именем startup в свой проект библиотеки классов и дать ему следующее определение, чтобы получить то, что вы хотите:

 using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace MyClassLibrary
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        }
    }
}
  

Комментарии:

1. И где он вызывается или как его вызвать?

2. @Marc.2377 ты имеешь в виду класс Startup? Если вы говорите о классе Startup, то вы его не вызываете. Вы говорите ASP.NET о вашем классе startup и позвольте framework обрабатывать его вызов. Более подробную информацию можно найти здесь: learn.microsoft.com/en-us/aspnet/core/fundamentals/startup

Ответ №2:

Как только я создам a, ChatHub который является производным от Microsoft.AspNetCore.SignalR.Hub<IChatClient> .

Все компоненты были расположены отдельно.стандартная библиотека net.

IChatClient выглядит следующим образом (используется для обеспечения безопасности типов):

 public interface IChatClient
{
    Task ReceiveChatMessage(string user, string message, DateTime sentAt, bool isMarkedAsImportant);

    Task ReceiveChatActivity(string user, Activity activity, DateTime sentAt);
}
  

Наконец, я использовал это ChatHub в ASP.net основной проект, в Startup котором концентратор настроен следующим образом:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseCors(builder =>
                    {
                        builder.WithOrigins("https://localhost:3000")
                               .AllowAnyHeader()
                               .AllowAnyMethod()
                               .AllowCredentials();
                    });
        IdentityModelEventSource.ShowPII = true;
    }
    else
    {
        app.UseGlobalExceptionHandler();

        app.UseHttpsRedirection();
        app.NwebSecApiSetup();
    }

    app.UseDefaultFiles();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllers();
                         endpoints.MapHub<ChatHub>("/api/chat");
                         endpoints.MapHub<EventHub>("/api/events");
                     });
}
  

Кроме того, я настроил кое-что еще для SignalR в ConfigureServices методе:

 public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
    services.AddControllers().AddControllersAsServices();

    services.AddHttpContextAccessor();
    services.AddConnections();
    services.AddSignalR(options =>
                        {
                            options.EnableDetailedErrors = true;
                        })
            .AddNewtonsoftJsonProtocol();

    ...
}
  

Я полагаю, вы можете легко использовать такие концентраторы и в других проектах.