Użyj interfejsów API ASP.NET Core w bibliotece klas
Autor: Scott Addie
Ten dokument zawiera wskazówki dotyczące używania interfejsów API ASP.NET Core w bibliotece klas. Aby uzyskać wszystkie inne wskazówki dotyczące biblioteki, zobacz wskazówki dotyczące biblioteki open source .
Określenie, które wersje ASP.NET Core wspierać
ASP.NET Core jest zgodna z zasadami obsługi platformy .NET Core .NET Core. Zapoznaj się z polityką wsparcia podczas określania, które wersje ASP.NET Core należy obsługiwać w bibliotece. Biblioteka powinna:
- Staraj się obsługiwać wszystkie wersje ASP.NET Core sklasyfikowane jako Long-Term Support (LTS).
- Nie należy wspierać wersji ASP.NET Core sklasyfikowanych jako End of Life (EOL).
W miarę udostępniania wersji zapoznawczych ASP.NET Core, znaczące zmiany są publikowane w repozytorium aspnet/Announcements GitHub. Testowanie zgodności bibliotek można przeprowadzić w miarę opracowywania funkcji platformy.
Korzystanie z platformy udostępnionej ASP.NET Core
Wraz z wydaniem platformy .NET Core 3.0 wiele zestawów ASP.NET Core nie jest już publikowanych w programie NuGet jako pakietów. Zamiast tego biblioteki są zawarte w Microsoft.AspNetCore.App
udostępnionej platformie, która jest instalowana przez instalatory .NET Core SDK oraz środowiska uruchomieniowego. Aby uzyskać listę pakietów, które nie są już publikowane, zobacz Usuń przestarzałe odwołania do pakietów.
Od wersji .NET Core 3.0 projekty korzystające z zestawu SDK msBuild Microsoft.NET.Sdk.Web
niejawnie odwołują się do struktury udostępnionej. Projekty korzystające z zestawu SDK Microsoft.NET.Sdk
lub Microsoft.NET.Sdk.Razor
muszą odwoływać się do ASP.NET Core, aby korzystać z interfejsów API platformy ASP.NET Core we wspólnej strukturze.
Aby odwołać się do ASP.NET Core, dodaj następujący element <FrameworkReference>
do pliku projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Uwzględnij rozszerzalność Blazor
Blazor obsługuje tworzenie składników Razor bibliotek klas dla aplikacji po stronie serwera i aplikacji po stronie klienta. Aby obsługiwać składniki Razor w bibliotece klas, biblioteka klas musi używać zestawu SDK Microsoft.NET.SdkRazor.
Obsługa aplikacji po stronie serwera i po stronie klienta
Aby obsługiwać użycie składników Razor przez aplikacje po stronie serwera i po stronie klienta z jednej biblioteki, skorzystaj z poniższych instrukcji dla edytora.
- programu Visual Studio
- Visual Studio Code / interfejs linii poleceń .NET
Użyj szablonu projektu biblioteki klas Razor.
Notatka
Nie zaznacz pola wyboru Strony i widoki pomocy technicznej. Zaznaczenie pola wyboru powoduje wyświetlenie biblioteki klas, która obsługuje tylko aplikacje po stronie serwera.
Biblioteka wygenerowana na podstawie szablonu projektu:
- Dotyczy bieżącej platformy .NET framework opartej na zainstalowanym zestawie SDK.
- Umożliwia sprawdzanie zgodności przeglądarki pod kątem zależności platformy przez uwzględnienie
browser
jako obsługiwanej platformy z elementemSupportedPlatform
MSBuild. - Dodaje odwołanie do pakietu NuGet dla Microsoft.AspNetCore.Components.Web.
Notatka
Linki w dokumentacji do kodu źródłowego platformy .NET zwykle ładują domyślną gałąź repozytorium, która reprezentuje bieżący rozwój dla następnego wydania .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać znacznik wersji kodu źródłowego ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Obsługa wielu wersji platformy
Jeśli biblioteka musi obsługiwać funkcje dodane do Blazor w bieżącej wersji, a jednocześnie obsługiwać co najmniej jedną starszą wersję, należy zastosować wielokierunkowe targetowanie biblioteki. Podaj rozdzieloną średnikami listę Target Framework Monikers (TFMs) we właściwości TargetFrameworks
MSBuild:
<TargetFrameworks>{TARGET FRAMEWORKS}</TargetFrameworks>
W poprzednim przykładzie symbol zastępczy {TARGET FRAMEWORKS}
reprezentuje listę TFMs oddzieloną średnikami. Na przykład netcoreapp3.1;net5.0
.
Wsparcie tylko dla przetwarzania po stronie serwera
Biblioteki klas są rzadko tworzone tak, aby obsługiwały tylko aplikacje po stronie serwera. Jeśli biblioteka klas wymaga tylko funkcji specyficznych dla serwera, takich jak dostęp do CircuitHandler lub Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage, lub używa ASP.NET podstawowych funkcji, takich jak oprogramowanie pośredniczące, kontrolery MVC lub Razor Pages, należy użyć jednej następujących metod:
Określ, że biblioteka obsługuje strony i widoki, zaznaczając pole wyboru Obsługa stron i widoków podczas tworzenia biblioteki (Visual Studio) lub używając opcji
-s|--support-pages-and-views
z poleceniemdotnet new
.dotnet new razorclasslib -s
Oprócz innych wymaganych właściwości programu MSBuild podaj odwołanie do platformy ASP.NET Core w pliku projektu biblioteki:
<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
Aby uzyskać więcej informacji na temat bibliotek zawierających składniki Razor, zobacz artykuł na temat używania składników ASP.NET Core Razor z bibliotek klas Razor (RCL).
Uwzględnij rozszerzalność MVC
W tej sekcji opisano zalecenia dotyczące bibliotek, które obejmują:
W tej sekcji nie omówiono wieloplatformowości mającej na celu obsługę wielu wersji MVC. Aby uzyskać wskazówki dotyczące obsługi wielu wersji ASP.NET Core, zobacz Obsługa wielu wersji ASP.NET Core.
widoki Razor lub strony Razor
Projekt zawierający widoki Razor lub Razor Pages musi używać Microsoft.NET.Sdk.Razor SDK.
Jeśli projekt jest przeznaczony dla platformy .NET Core 3.x, wymaga:
- Właściwość
AddRazorSupportForMvc
MSBuild ustawiona na wartośćtrue
. - Element
<FrameworkReference>
dla struktury udostępnionej.
Szablon projektu biblioteki klas Razor spełnia powyższe wymagania dotyczące projektów przeznaczonych dla platformy .NET Core. Skorzystaj z poniższych instrukcji dla edytora.
- programu Visual Studio
- programu Visual Studio Code/ interfejsu wiersza polecenia .NET
Użyj szablonu projektu biblioteki klas Razor. Należy zaznaczyć pole wyboru szablonu dla stron pomocy technicznej i widoków.
Na przykład:
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Jeśli projekt jest przeznaczony dla platformy .NET Standard, wymagana jest referencja do pakietu Microsoft.AspNetCore.Mvc. Pakiet Microsoft.AspNetCore.Mvc
przeniesiony do struktury udostępnionej w ASP.NET Core 3.0 i dlatego nie jest już publikowany. Na przykład:
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
</ItemGroup>
</Project>
Pomocnicy tagów
Projekt obejmujący pomocników tagów powinien używać zestawu SDK Microsoft.NET.Sdk
. W przypadku określania wartości docelowej platformy .NET Core 3.x dodaj element <FrameworkReference>
dla wspólnej platformy. Na przykład:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Jeśli jest przeznaczona dla platformy .NET Standard (aby obsługiwać wersje wcześniejsze niż ASP.NET Core 3.x), dodaj odwołanie do pakietu do Microsoft.AspNetCore.Mvc.Razor. Pakiet Microsoft.AspNetCore.Mvc.Razor
został przeniesiony do struktury udostępnionej i dlatego nie został już opublikowany. Na przykład:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
</ItemGroup>
</Project>
Wyświetlanie składników
Projekt zawierający składniki View powinien używać zestawu SDK Microsoft.NET.Sdk
. Jeśli docelową platformą jest .NET Core 3.x, dodaj element <FrameworkReference>
dla ramy współdzielonej. Na przykład:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Aby korzystać z .NET Standard (w celu obsługi wersji wcześniejszych niż ASP.NET Core 3.x), dodaj odwołanie do pakietu Microsoft.AspNetCore.Mvc.ViewFeatures. Pakiet Microsoft.AspNetCore.Mvc.ViewFeatures
został przeniesiony do struktury udostępnionej i dlatego nie został już opublikowany. Na przykład:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
</ItemGroup>
</Project>
Obsługa wielu wersji ASP.NET Core
Wielokrotne kierowanie jest wymagane do utworzenia biblioteki obsługującej wiele wariantów ASP.NET Core. Rozważmy scenariusz, w którym biblioteka pomocników tagów musi obsługiwać następujące warianty ASP.NET Core:
- ASP.NET Core 2.1 przeznaczone dla platformy .NET Framework 4.6.1
- ASP.NET Core 2.x przeznaczone dla platformy .NET Core 2.x
- ASP.NET Core 3.x przeznaczone dla platformy .NET Core 3.x
Następujący plik projektu obsługuje te warianty za pośrednictwem właściwości TargetFrameworks
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net461</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.16.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Z poprzednim plikiem projektu:
- Pakiet
Markdig
jest dodawany dla wszystkich użytkowników. - Odwołanie do Microsoft.AspNetCore.Mvc.Razor jest dodawane dla odbiorców docelowych na .NET Framework 4.6.1 lub nowszej lub .NET Core 2.x. Wersja 2.1.0 pakietu działa z ASP.NET Core 2.2 dzięki zgodności wstecznej.
- Odwołuje się do wspólnej platformy przeznaczonej dla użytkowników celujących w .NET Core 3.x. Pakiet
Microsoft.AspNetCore.Mvc.Razor
znajduje się w strukturze udostępnionej.
W alternatywie, można celować w .NET Standard 2.0 zamiast celować zarówno w .NET Core 2.1, jak i .NET Framework 4.6.1.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.16.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
W poprzednim pliku projektu istnieją następujące zastrzeżenia:
- Ponieważ biblioteka zawiera tylko pomocników tagów, łatwiej jest kierować do określonych platform, na których działa ASP.NET Core: .NET Core i .NET Framework. Pomocnicy tagów nie mogą być używane przez inne platformy docelowe zgodne ze standardem .NET Standard 2.0, takie jak Unity i UWP.
- Korzystanie z platformy .NET Standard 2.0 z programu .NET Framework ma pewne problemy, które zostały rozwiązane w programie .NET Framework 4.7.2. Możesz poprawić doświadczenie użytkowników korzystających z platformy .NET Framework od wersji 4.6.1 do 4.7.1, celując w platformę .NET Framework 4.6.1.
Jeśli biblioteka musi wywoływać interfejsy API specyficzne dla platformy, prosimy celować w konkretne implementacje .NET zamiast .NET Standard. Aby uzyskać więcej informacji, zobacz wielotargetowość.
Używanie interfejsu API, który nie został zmieniony
Wyobraź sobie scenariusz, w którym uaktualniasz bibliotekę oprogramowania pośredniczącego z platformy .NET Core 2.2 do wersji 3.1. Interfejsy API middleware ASP.NET Core używane w bibliotece nie uległy zmianie pomiędzy wersjami ASP.NET Core 2.2 i 3.1. Aby kontynuować obsługę biblioteki oprogramowania pośredniczącego na platformie .NET Core 3.1, wykonaj następujące czynności:
- Postępuj zgodnie z wytycznymi dotyczącymi standardowej biblioteki .
- Dodaj odwołanie do pakietu NuGet dla każdego pakietu NuGet interfejsu API, jeśli odpowiedni zestaw nie istnieje w strukturze udostępnionej.
Używanie zmienionego interfejsu API
Wyobraź sobie scenariusz, w którym uaktualniasz bibliotekę z platformy .NET Core 2.2 do platformy .NET Core 3.1. Interfejs API platformy ASP.NET Core używany w bibliotece zawiera zmianę powodującą niezgodność
Jeśli możesz ponownie napisać bibliotekę, zrób to i przejdź do wcześniejszej platformy docelowej (na przykład .NET Standard 2.0 lub .NET Framework 4.6.1) z odwołaniami do pakietów.
Jeśli nie możesz ponownie napisać biblioteki, wykonaj następujące kroki:
- Dodaj cel dla .NET Core 3.1.
- Dodaj element
<FrameworkReference>
dla struktury udostępnionej. - Użyj dyrektywy #if preprocesora z odpowiednim symbolem struktury docelowej, aby warunkowo skompilować kod.
Na przykład, począwszy od wersji ASP.NET Core 3.1, synchroniczne odczyty i zapisy w strumieniach żądań HTTP i odpowiedzi są domyślnie wyłączone. program ASP.NET Core 2.2 domyślnie obsługuje zachowanie synchroniczne. Rozważ bibliotekę oprogramowania pośredniczącego, w której należy włączyć synchroniczne odczyty i zapisy, w których występują operacje we/wy. Biblioteka powinna ująć kod, aby włączyć funkcje synchroniczne w odpowiedniej dyrektywie preprocesora. Na przykład:
public async Task Invoke(HttpContext httpContext)
{
if (httpContext.Request.Path.StartsWithSegments(_path, StringComparison.Ordinal))
{
httpContext.Response.StatusCode = (int) HttpStatusCode.OK;
httpContext.Response.ContentType = "application/json";
httpContext.Response.ContentLength = _bufferSize;
#if !NETCOREAPP3_1 && !NETCOREAPP5_0
var syncIOFeature = httpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
using (var sw = new StreamWriter(
httpContext.Response.Body, _encoding, bufferSize: _bufferSize))
{
_json.Serialize(sw, new JsonMessage { message = "Hello, World!" });
}
#else
await JsonSerializer.SerializeAsync<JsonMessage>(
httpContext.Response.Body, new JsonMessage { message = "Hello, World!" });
#endif
return;
}
await _next(httpContext);
}
Korzystanie z interfejsu API wprowadzonego w wersji 3.1
Załóżmy, że chcesz użyć interfejsu API core ASP.NET wprowadzonego w ASP.NET Core 3.1. Weź pod uwagę następujące pytania:
- Czy biblioteka funkcjonalnie wymaga nowego interfejsu API?
- Czy biblioteka może zaimplementować tę funkcję w inny sposób?
Jeśli biblioteka funkcjonalnie wymaga interfejsu API i nie ma możliwości zaimplementowania go na poziomie podrzędnym:
- Tylko .NET Core 3.x jako docelowy.
- Dodaj element
<FrameworkReference>
dla struktury udostępnionej.
Jeśli biblioteka może zaimplementować tę funkcję w inny sposób:
- Dodaj platformę .NET Core 3.x jako platformę docelową.
- Dodaj element
<FrameworkReference>
dla struktury udostępnionej. - Użyj dyrektywy #if preprocesora z odpowiednim symbolem struktury docelowej, aby warunkowo skompilować kod.
Na przykład poniższy pomocnik tagów używa interfejsu IWebHostEnvironment wprowadzonego w ASP.NET Core 3.1. Odbiorcy docelowi platformy .NET Core 3.1 wykonują ścieżkę kodu zdefiniowaną przez symbol platformy docelowej NETCOREAPP3_1
. Typ parametru konstruktora pomocnika tagów zmienia się na IHostingEnvironment dla użytkowników platform .NET Core 2.1 i .NET Framework 4.6.1. Ta zmiana była konieczna, ponieważ ASP.NET Core 3.1 oznaczyło IHostingEnvironment
jako przestarzałe i zaleciło IWebHostEnvironment
jako zamiennik.
[HtmlTargetElement("script", Attributes = "asp-inline")]
public class ScriptInliningTagHelper : TagHelper
{
private readonly IFileProvider _wwwroot;
#if NETCOREAPP3_1
public ScriptInliningTagHelper(IWebHostEnvironment env)
#else
public ScriptInliningTagHelper(IHostingEnvironment env)
#endif
{
_wwwroot = env.WebRootFileProvider;
}
// code omitted for brevity
}
Następujący wielokierunkowy plik projektu obsługuje ten scenariusz pomocnika tagów:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net461</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.16.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Używanie interfejsu API usuniętego ze struktury udostępnionej
Aby użyć zestawu ASP.NET Core usuniętego ze struktury udostępnionej, dodaj odpowiednie odwołanie do pakietu. Aby uzyskać listę pakietów usuniętych ze struktury udostępnionej w programie ASP.NET Core 3.1, zobacz Usuwanie przestarzałych odwołań do pakietów.
Aby na przykład dodać klienta webowego interfejsu API:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
</ItemGroup>
</Project>