Udostępnij za pośrednictwem


Metody usługi SignalR Hub próbują rozpoznać parametry z di

Metody usługi SignalR Hub obsługują teraz wstrzykiwanie usług z kontenera wstrzykiwania zależności (DI). W rzadkich przypadkach może to uszkodzić aplikacje, które mają typ di, który jest również akceptowany w metodach koncentratora z komunikatów klienta usługi SignalR.

Wprowadzona wersja

ASP.NET Core 7.0

Poprzednie zachowanie

Jeśli zaakceptowano typ w metodzie Centrum, który był również w kontenerze wstrzykiwania zależności, typ będzie zawsze rozpoznawany z komunikatu wysyłanego przez klienta.

Services.AddScoped<SomeCustomType>();

class MyHub : Hub
{
    // type always comes from the client, never comes from DI
    public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}

Nowe zachowanie

Typy w di są sprawdzane podczas uruchamiania aplikacji przy użyciu, IServiceProviderIsService aby określić, czy argument w metodzie hub pochodzi z di lub z klienta.

W poniższym przykładzie założono, że używasz domyślnego kontenera di, SomeCustomType pochodzi z kontenera DI zamiast z klienta. Jeśli klient spróbuje wysłać SomeCustomTypepolecenie , zostanie wyświetlony błąd:

Services.AddScoped<SomeCustomType>();

class MyHub : Hub
{
    // comes from DI by default
    public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}

Typ zmiany powodującej niezgodność

Ta zmiana ma wpływ na zgodność ze źródłem.

Przyczyna wprowadzenia zmiany

Ta zmiana poprawia środowisko użytkownika podczas korzystania z różnych usług w różnych metodach Centrum. Zwiększa również wydajność, nie wymagając od użytkownika wstrzykiwania wszystkich zależności w konstruktorze centrum.

Prawdopodobieństwo wystąpienia przerwania aplikacji jest niskie, ponieważ nie jest powszechne posiadanie typu di i jako argument w metodzie Centrum w tym samym czasie.

Jeśli ta zmiana zostanie przerwana, możesz wyłączyć tę funkcję, ustawiając wartość DisableImplicitFromServicesParameters true:

Services.AddSignalR(options =>
{
    options.DisableImplicitFromServicesParameters = true;
});

Jeśli zmiana zostanie przerwana, ale chcesz użyć tej funkcji bez klientów powodujących niezgodność, możesz wyłączyć tę funkcję, jak pokazano powyżej, i użyć atrybutu implementujący IFromServiceMetadata nowe argumenty/metody centrum:

Services.AddScoped<SomeCustomType>();
Services.AddScoped<SomeCustomType2>();

class MyHub : Hub
{
    // old method with new feature (non-breaking), only SomeCustomType2 is resolved from DI
    public Task MethodA(string arguments, SomeCustomType type, [FromServices] SomeCustomType2 type2);

    // new method
    public Task MethodB(string arguments, [FromServices] SomeCustomType type);
}

Dotyczy interfejsów API

Metody koncentratora