Udostępnij za pośrednictwem


Wskazówki dotyczące użycia

Microsoft.AspNetCore.SystemWebAdapters Zapewnia warstwę emulacji, która naśladuje zachowanie platformy ASP.NET w ASP.NET Core. Poniżej przedstawiono kilka wskazówek dotyczących niektórych zagadnień dotyczących korzystania z nich:

HttpContext życie

Karty są obsługiwane przez HttpContext program , których nie można używać w okresie istnienia żądania. HttpContext W związku z tym podczas uruchamiania na platformie ASP.NET Core nie można również używać żądania, podczas gdy w ASP.NET Framework będzie działać czasami. Element ObjectDisposedException zostanie zgłoszony w przypadkach, w których jest używany po zakończeniu żądania.

Zalecenie: Przechowuj wartości wymagane do poCO i przytrzymaj je.

Konwersja na HttpContext

Istnieją dwa sposoby konwertowania elementu HttpContext na :HttpContext

  • Rzutowanie niejawne
  • Użycie konstruktora

Zalecenie: W większości przypadków preferowane jest niejawne rzutowanie, ponieważ spowoduje to buforowanie utworzonego wystąpienia i zapewnienie tylko pojedynczego HttpContext rzutowania na żądanie.

CurrentCulture nie jest ustawiona domyślnie

W programie ASP.NET Framework CurrentCulture ustawiono żądanie, ale nie odbywa się to automatycznie w programie ASP.NET Core. Zamiast tego należy dodać odpowiednie oprogramowanie pośredniczące do potoku.

Zalecenie: aby uzyskać szczegółowe informacje na temat sposobu włączania tej funkcji, zobacz ASP.NET Core Localization ( Lokalizacja podstawowa).

Najprostszym sposobem włączenia tego ustawienia z podobnym zachowaniem, jak ASP.NET Framework, byłoby dodanie następujących elementów do potoku:

app.UseRequestLocalization();

CurrentPrincipal

W programie ASP.NET Framework CurrentPrincipal i Current zostanie ustawiona wartość bieżącego użytkownika. Nie jest to dostępne w ASP.NET Core z pudełka. Obsługa tej funkcji jest dostępna w przypadku tych kart przez dodanie elementu ISetThreadCurrentPrincipal do punktu końcowego (dostępnego dla kontrolerów za pośrednictwem elementu SetThreadCurrentPrincipalAttribute). Należy jednak używać go tylko wtedy, gdy nie można refaktoryzować kodu w celu usunięcia użycia.

Zalecenie: Jeśli to możliwe, użyj właściwości User lub User zamiast tego, przekazując ją do witryny wywołania. Jeśli nie jest to możliwe, włącz ustawienie bieżącego użytkownika, a także rozważ ustawienie żądania jako pojedynczego wątku logicznego (zobacz poniżej, aby uzyskać szczegółowe informacje).

Wątek żądania nie istnieje w ASP.NET Core

W ASP.NET Framework żądanie miało koligację wątków i Current byłoby dostępne tylko wtedy, gdy w tym wątku. ASP.NET Core nie ma tej gwarancji, więc Current będzie dostępna w tym samym kontekście asynchronicznym, ale nie zostaną wykonane żadne gwarancje dotyczące wątków.

Zalecenie: Jeśli odczyt/zapis w pliku HttpContext, musisz upewnić się, że robisz to w sposób jednowątkowy. Możesz wymusić, aby żądanie nigdy nie było uruchamiane współbieżnie w dowolnym kontekście asynchroniczny, ustawiając wartość ISingleThreadedRequestMetadata. Będzie to miało wpływ na wydajność i powinno być używane tylko wtedy, gdy nie można refaktoryzować użycia w celu zapewnienia dostępu niebieżnego. Dostępna jest implementacja dodawania do kontrolerów za pomocą polecenia SingleThreadedRequestAttribute:

[SingleThreadedRequest]
public class SomeController : Controller
{
    ...
} 

Request może być konieczne wstępne przebuforowane

Domyślnie żądanie przychodzące nie zawsze jest możliwe do wyszukiwania ani w pełni dostępne. Aby można było zobaczyć zachowanie w programie .NET Framework, możesz zdecydować się na wstępne przesyłanie strumienia wejściowego. Spowoduje to pełne odczytanie przychodzącego strumienia i buforowania go do pamięci lub dysku (w zależności od ustawień).

Zalecenie: można to włączyć, stosując metadane punktu końcowego, które implementują IPreBufferRequestStreamMetadata interfejs. Jest to dostępne jako atrybut PreBufferRequestStreamAttribute , który można zastosować do kontrolerów lub metod.

Aby włączyć tę funkcję we wszystkich punktach końcowych MVC, istnieje metoda rozszerzenia, która może być używana w następujący sposób:

app.MapDefaultControllerRoute()
    .PreBufferRequestStream();

Response może wymagać buforowania

Niektóre interfejsy API wymagają Response buforowanego strumienia wyjściowego, takiego jak Output, End(), Clear()i SuppressContent.

Zalecenie: Aby zapewnić obsługę zachowania, Response które wymaga buforowania odpowiedzi przed wysłaniem, punkty końcowe muszą wyrazić zgodę na to przy użyciu metadanych punktu końcowego implementujących IBufferResponseStreamMetadataelement .

Aby włączyć tę funkcję we wszystkich punktach końcowych MVC, istnieje metoda rozszerzenia, która może być używana w następujący sposób:

app.MapDefaultControllerRoute()
    .BufferResponseStream();

Stan sesji udostępnionej

Aby można było obsługiwać Sessionprogram , punkty końcowe muszą wyrazić zgodę na to za pośrednictwem metadanych implementowania ISessionMetadataelementu .

Zalecenie: Aby włączyć tę funkcję we wszystkich punktach końcowych MVC, istnieje metoda rozszerzenia, która może być używana w następujący sposób:

app.MapDefaultControllerRoute()
    .RequireSystemWebAdapterSession();

Wymaga to również implementacji magazynu sesji. Aby uzyskać szczegółowe informacje o opcjach, zobacz tutaj.

Sesja zdalna uwidacznia dodatkowy punkt końcowy dla aplikacji

Obsługa sesji zdalnej uwidacznia punkt końcowy, który umożliwia aplikacji podstawowej pobieranie informacji o sesji. Może to spowodować istnienie potencjalnie długotrwałego żądania między podstawową aplikacją a aplikacją platformy, ale upłynął limit czasu bieżącego żądania lub limitu czasu sesji (domyślnie wynosi 20 minut).

Zalecenie: Upewnij się, że używany klucz interfejsu API jest silny i że połączenie z aplikacją platformy odbywa się za pośrednictwem protokołu SSL.

Katalogi wirtualne muszą być identyczne dla aplikacji platformowych i podstawowych

Konfiguracja katalogu wirtualnego jest używana do generowania tras, autoryzacji i innych usług w systemie. W tym momencie nie znaleziono niezawodnej metody włączania różnych katalogów wirtualnych ze względu na sposób działania platformy ASP.NET Framework.

Zalecenie: Upewnij się, że dwie aplikacje znajdują się w różnych lokacjach (hostach i/lub portach) z tym samym układem aplikacji/katalogu wirtualnego.