Share via


CA2234: Skicka System.Uri-objekt i stället för strängar

Property Värde
Regel-ID CA2234
Rubrik Skicka System.Uri-objekt i stället för strängar
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Ett anrop görs till en metod som har en strängparameter vars namn innehåller "uri", "Uri", "urn", "Urn", "url" eller "Url" och metodens deklarerande typ innehåller en motsvarande metodöverlagring som har en System.Uri parameter.

Som standard tittar den här regeln bara på externt synliga metoder och typer, men detta kan konfigureras.

Regelbeskrivning

Ett parameternamn delas upp i token baserat på kamelhöljekonventionen och sedan kontrolleras varje token för att se om den är lika med "uri", "Uri", "urn", "Urn", "url" eller "Url". Om det finns en matchning antas parametern representera en enhetlig resursidentifierare (URI). En strängrepresentation av en URI är benägen att parsa och koda fel och kan leda till säkerhetsrisker. Klassen Uri tillhandahåller dessa tjänster på ett säkert och säkert sätt. När det finns ett val mellan två överlagringar som bara skiljer sig åt när det gäller representationen av en URI, bör användaren välja den överlagring som tar ett Uri argument.

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln anropar du den överlagring som tar Uri argumentet.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln om strängparametern inte representerar en URI.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2234
// The code that's violating the rule is on this line.
#pragma warning restore CA2234

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2234.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (användning) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika API-ytor

Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exempel

I följande exempel visas en metod, ErrorProne, som bryter mot regeln och en metod, SaferWay, som korrekt anropar överbelastningen Uri :

Imports System

Namespace ca2234

    Class History

        Friend Sub AddToHistory(uriString As String)
        End Sub

        Friend Sub AddToHistory(uriType As Uri)
        End Sub

    End Class

    Public Class Browser

        Dim uriHistory As New History()

        Sub ErrorProne()
            uriHistory.AddToHistory("http://www.adventure-works.com")
        End Sub

        Sub SaferWay()
            Try
                Dim newUri As New Uri("http://www.adventure-works.com")
                uriHistory.AddToHistory(newUri)
            Catch uriException As UriFormatException
            End Try
        End Sub

    End Class

End Namespace
class History
{
    internal void AddToHistory(string uriString) { }
    internal void AddToHistory(Uri uriType) { }
}

public class Browser
{
    History uriHistory = new History();

    public void ErrorProne()
    {
        uriHistory.AddToHistory("http://www.adventure-works.com");
    }

    public void SaferWay()
    {
        try
        {
            Uri newUri = new Uri("http://www.adventure-works.com");
            uriHistory.AddToHistory(newUri);
        }
        catch (UriFormatException) { }
    }
}