Używanie 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ślanie, które wersje ASP.NET Core do obsługi
ASP.NET Core jest zgodna z zasadami obsługi platformy .NET Core. Zapoznaj się z zasadami pomocy technicznej podczas określania, które wersje ASP.NET Core do obsługi w bibliotece. Biblioteka powinna:
- Staraj się obsługiwać wszystkie wersje ASP.NET Core sklasyfikowane jako obsługa długoterminowa (LTS).
- Nie należy wspierać wersji ASP.NET Core sklasyfikowanych jako End of Life (EOL).
W miarę udostępniania wersji zapoznawczych ASP.NET Core zmiany powodujące niezgodność są publikowane w repozytorium GitHub aspnet/Anonss . 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 zestawy są zawarte w strukturze udostępnionej Microsoft.AspNetCore.App
, która jest instalowana z instalatorami zestawu .NET Core SDK i środowiska uruchomieniowego. Aby uzyskać listę pakietów, które nie są już publikowane, zobacz Usuwanie przestarzałych odwołań do pakietów.
Od wersji .NET Core 3.0 projekty korzystające z Microsoft.NET.Sdk.Web
zestawu MSBuild SDK niejawnie odwołują się do udostępnionej platformy. Projekty korzystające z zestawu Microsoft.NET.Sdk
SDK Microsoft.NET.Sdk.Razor
lub muszą odwoływać się ASP.NET Core do korzystania z interfejsów API ASP.NET Core w strukturze udostępnionej.
Aby odwołać się do ASP.NET Core, dodaj następujący <FrameworkReference>
element do pliku projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Uwzględnij Blazor rozszerzalność
Blazor Obsługuje tworzenie Razor bibliotek klas składników dla aplikacji po stronie serwera i po stronie klienta. Aby obsługiwać Razor składniki w bibliotece klas, biblioteka klas musi używać zestawu Microsoft.NET.Sdk.Razor Zestaw SDK.
Obsługa aplikacji po stronie serwera i po stronie klienta
Aby obsługiwać Razor użycie składników przez aplikacje po stronie serwera i po stronie klienta z jednej biblioteki, skorzystaj z poniższych instrukcji dla edytora.
Użyj szablonu Razor projektu Biblioteka klas.
Uwaga
Nie zaznaczaj pól 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, uwzględniając
browser
jako obsługiwaną platformę z elementemSupportedPlatform
MSBuild. - Dodaje odwołanie do pakietu NuGet dla pliku Microsoft.AspNetCore.Components.Web.
RazorClassLibrary-CSharp.csproj
(źródło referencyjne)
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .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ć tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Obsługa wielu wersji platformy
Jeśli biblioteka musi obsługiwać funkcje dodane w Blazor bieżącej wersji, a jednocześnie obsługiwać co najmniej jedną starszą wersję, wiele elementów docelowych biblioteki. Podaj rozdzieloną średnikami listę obiektów Target Framework Monikers (TFMs) we TargetFrameworks
właściwości MSBuild:
<TargetFrameworks>{TARGET FRAMEWORKS}</TargetFrameworks>
W poprzednim przykładzie {TARGET FRAMEWORKS}
symbol zastępczy reprezentuje listę rozdzielonych średnikami serwera TFMs. Na przykład netcoreapp3.1;net5.0
.
Obsługa tylko użycia 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 funkcji specyficznych dla rdzenia, takich jak oprogramowanie pośredniczące, kontrolery MVC lub Razor strony, należy użyć jednej z następujących metod:
Określ, że biblioteka obsługuje strony i widoki po utworzeniu biblioteki za pomocą pola wyboru Strony pomocy technicznej i widoki (Visual Studio) lub
-s|--support-pages-and-views
opcję zadotnet new
pomocą polecenia :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 Razor składniki, zobacz Używanie składników ASP.NET Core Razor z Razor biblioteki klas (RCL).
Uwzględnij rozszerzalność MVC
W tej sekcji opisano zalecenia dotyczące bibliotek, które obejmują:
W tej sekcji nie omówiono wielowersyjności w celu obsługi wielu wersji wzorca MVC. Aby uzyskać wskazówki dotyczące obsługi wielu wersji ASP.NET Core, zobacz Obsługa wielu wersji ASP.NET Core.
Razor widoki lub Razor strony
Projekt zawierający Razor widoki lub Razor strony musi używać zestawu Microsoft.NET.Sdk.Razor Zestaw SDK.
Jeśli projekt jest przeznaczony dla platformy .NET Core 3.x, wymaga:
- Właściwość MSBuild ustawiona
AddRazorSupportForMvc
natrue
. - Element
<FrameworkReference>
dla platformy udostępnionej.
Szablon Razor projektu Biblioteka klas spełnia powyższe wymagania dotyczące projektów przeznaczonych dla platformy .NET Core. Skorzystaj z poniższych instrukcji dla edytora.
Użyj szablonu Razor projektu Biblioteka klas. Należy zaznaczyć pole wyboru Strony i widoki pomocy technicznej szablonu.
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, wymagane jest odwołanie do pakietu Microsoft.AspNetCore.Mvc . Pakiet Microsoft.AspNetCore.Mvc
został 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 zawierający pomocników tagów powinien używać zestawu Microsoft.NET.Sdk
SDK. W przypadku określania wartości docelowej platformy .NET Core 3.x dodaj <FrameworkReference>
element dla platformy udostępnionej. 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 pliku 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>
Składniki widoku
Projekt zawierający składniki Widoku powinien używać zestawu Microsoft.NET.Sdk
SDK. W przypadku określania wartości docelowej platformy .NET Core 3.x dodaj <FrameworkReference>
element dla platformy udostępnionej. Na przykład:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
W przypadku określania wartości docelowej dla platformy .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
Wiele elementów docelowych 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 TargetFrameworks
właściwości :
<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. - Dla użytkowników przeznaczonych dla platformy .NET Framework 4.6.1 lub nowszej lub .NET Core 2.x jest dodawane odwołanie do platformy Microsoft.AspNetCore.MvcRazor . Wersja 2.1.0 pakietu działa z ASP.NET Core 2.2 ze względu na zgodność z poprzednimi wersjami.
- Do platformy udostępnionej odwołuje się użytkownik przeznaczony dla platformy .NET Core 3.x. Pakiet
Microsoft.AspNetCore.Mvc.Razor
jest uwzględniony w strukturze udostępnionej.
Alternatywnie można użyć platformy .NET Standard 2.0 zamiast kierowania na platformy .NET Core 2.1 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, UWP i Xamarin.
- 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 ulepszyć środowisko dla użytkowników przy użyciu programu .NET Framework 4.6.1 do 4.7.1, wybierając platformę .NET Framework 4.6.1.
Jeśli biblioteka musi wywoływać interfejsy API specyficzne dla platformy, docelowe implementacje platformy .NET zamiast .NET Standard. Aby uzyskać więcej informacji, zobacz Multi-target (Obsługa wielu elementów docelowych).
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 oprogramowania pośredniczącego ASP.NET Core używane w bibliotece nie uległy zmianie między 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 ze wskazówkami dotyczącymi biblioteki standardowej.
- 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 ma zmianę powodującą niezgodność w ASP.NET Core 3.1. Zastanów się, czy biblioteka może zostać przepisana, aby nie używać uszkodzonego interfejsu API we wszystkich wersjach.
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 element docelowy dla platformy .NET Core 3.1.
<FrameworkReference>
Dodaj element dla platformy udostępnionej.- Użyj dyrektywy #if preprocesora z odpowiednim symbolem struktury docelowej, aby warunkowo skompilować kod.
Na przykład synchroniczne odczyty i zapisy w strumieniach żądań HTTP i odpowiedzi są domyślnie wyłączone jako ASP.NET Core 3.1. 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. Zastanów się nad następującymi pytaniami:
- 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:
- Docelowy tylko program .NET Core 3.x.
<FrameworkReference>
Dodaj element dla platformy udostępnionej.
Jeśli biblioteka może zaimplementować tę funkcję w inny sposób:
- Dodaj platformę .NET Core 3.x jako platformę docelową.
<FrameworkReference>
Dodaj element dla platformy 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 wprowadzonego IWebHostEnvironment w ASP.NET Core 3.1. Odbiorcy docelowi platformy .NET Core 3.1 wykonują ścieżkę kodu zdefiniowaną przez symbol platformy NETCOREAPP3_1
docelowej. Typ parametru konstruktora pomocnika tagów zmienia się na IHostingEnvironment dla użytkowników platformy .NET Core 2.1 i .NET Framework 4.6.1. Ta zmiana była konieczna, ponieważ ASP.NET Core 3.1 oznaczone IHostingEnvironment
jako przestarzałe i zalecane 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 pakietu.
Aby na przykład dodać klienta internetowego 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>