Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od .NET 11, set akcesorium AsnEncodedData.RawData jest przestarzałe. Ustawienie tej właściwości w kodzie generuje ostrzeżenie SYSLIB0065 w czasie kompilacji.
Przyczyna wycofania z użycia
AsnEncodedData reprezentuje obiekt zakodowany w formacie ASN.1. Wiele typów, na przykład X509BasicConstraintsExtension, dziedziczy po nim i buforuje swoją zdekodowaną reprezentację, aby dostęp do właściwości nie powodował wielokrotnego dekodowania ASN.1.
Ponieważ RawData nie jest virtual, ustawienie tej właściwości w instancji pochodnej powoduje rozbieżność między zdekodowanym stanem zapisanym w pamięci podręcznej a nowymi surowymi danymi. Typ pochodny nie może wykryć, że nieprzetworzone dane uległy zmianie, więc nadal zwraca nieaktualne wartości zdekodowane. Przykład:
X509BasicConstraintsExtension extension = new(
certificateAuthority: true,
hasPathLengthConstraint: true,
pathLengthConstraint: 3,
critical: true);
X509BasicConstraintsExtension decoded = new();
decoded.RawData = extension.RawData;
Console.WriteLine(decoded.CertificateAuthority); // Unexpectedly prints False
Console.WriteLine(decoded.HasPathLengthConstraint); // Unexpectedly prints False
Console.WriteLine(decoded.PathLengthConstraint); // Unexpectedly prints 0
Rozwiązanie
Aby zachować równoważność między stanem dekodowanym a bazowymi danymi, użyj konstruktora odpowiedniego typu, aby zdekodować dane. Traktuj wystąpienia jako tylko do odczytu — skonstruuj nowe wystąpienie zamiast ponownie korzystać z istniejącego wystąpienia.
// Instead of setting RawData, use the constructor.
X509BasicConstraintsExtension decoded = new(extension, extension.Critical);
Jeśli potrzebujesz modyfikowalnego zachowania, użyj polecenia AsnEncodedData.CopyFrom(AsnEncodedData). Metoda CopyFrom to virtual, więc typy pochodne mogą unieważniać ich stan dekodowany, gdy dane pierwotne zmieniają się.
Pomijanie ostrzeżenia
Jeśli musisz użyć przestarzałego settera, możesz wyłączyć to ostrzeżenie w kodzie lub w pliku projektu.
Aby pominąć tylko jedno naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć ostrzeżenie.
// Disable the warning.
#pragma warning disable SYSLIB0065
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0065
Aby wyłączyć wszystkie SYSLIB0065 ostrzeżenia w projekcie, dodaj właściwość <NoWarn> do pliku projektu.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0065</NoWarn>
</PropertyGroup>
</Project>
Aby uzyskać więcej informacji, zobacz Pomijanie ostrzeżeń.