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 IBufferResponseStreamMetadata
element .
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 ISessionMetadata
elementu .
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.