solvethree aus einem ASP.NET Core-Backend aufrufen

Von solvethree4 Min. Lesezeit

Registrieren Sie einen typisierten HttpClient, erstellen Sie den Task einmalig und fragen Sie anschließend seinen Status innerhalb einer festen Zeitgrenze ab. Bewahren Sie den API-Schlüssel auf dem Server auf und schützen Sie alle Anwendungsrouten, die den Client aufrufen.

Das folgende Beispiel ist eine REST-Hilfsklasse für reCAPTCHA Enterprise, kein offizielles C#-SDK. Sie trennt die Erstellung und Abfrage von Tasks, damit Ihre Anwendung nicht eine eingehende Anfrage offen halten muss, bis der Lösungsversuch abgeschlossen ist.

Auf dieser Seite

Typisierten Client registrieren

Aktivieren Sie zunächst in der Konsole das Profil der Zielwebsite für Ihren Workspace. Das Senden eines Hostnamens und einer Aktion erstellt kein Profil. Lesen Sie die Anleitung zur Einrichtung eines Websiteprofils, falls die Website noch nicht konfiguriert ist.

Hinterlegen Sie den Workspace-Schlüssel in der Serverkonfiguration als SOLVETHREE_API_KEY. Fügen Sie die Clientklasse hinzu, entfernen Sie dann die Kommentierung der unter Program.cs gezeigten Registrierung und platzieren Sie sie vor builder.Build().

ASP.NET Core · Ein typisierter HTTP-Client
// CaptchaClient.cs; .NET 8+, System.Net.Http.Json and System.Text.Json.Nodes.
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json.Nodes;

public sealed class CaptchaClient(HttpClient http)
{
    public async Task<JsonObject> CreateAsync(string site, string proxy, string requestId,
        CancellationToken cancellationToken)
    {
        using var response = await http.PostAsJsonAsync("tasks?waitMs=0",
            new { site, action = "login", proxy, requestId }, cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
    public async Task<JsonObject> GetAsync(string id, CancellationToken cancellationToken)
    {
        using var response = await http.GetAsync("tasks/" + Uri.EscapeDataString(id) + "?waitMs=15000",
            cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
}
// Program.cs, before builder.Build(), in an existing authenticated ASP.NET app:
// builder.Services.AddHttpClient<CaptchaClient>(http => {
//     http.BaseAddress = new Uri("https://api.solvethree.com/v1/");
//     http.Timeout = TimeSpan.FromSeconds(25);
//     http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
//         "Bearer", builder.Configuration["SOLVETHREE_API_KEY"]
//             ?? throw new InvalidOperationException("Missing API key"));
// }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
//     AllowAutoRedirect = false
// });
// Inject CaptchaClient into your authenticated controller/service. Pass its
// cancellation token, create once, save id and poll GetAsync with a finite deadline.

Die Registrierung legt die API-Basisadresse, die Bearer-Authentifizierung und ein Transport-Timeout von 25 Sekunden fest und deaktiviert automatische Weiterleitungen. Behalten Sie den abschließenden Schrägstrich der Basisadresse bei: Die relativen tasks-Pfade des Clients müssen unter /v1/ aufgelöst werden.

Die Hilfsklasse verwendet die JSON-Erweiterungen von HttpClient und gibt ein JsonObject zurück. Beide Methoden prüfen vor der Deserialisierung, ob die HTTP-Anfrage erfolgreich war. Injizieren Sie CaptchaClient in einen authentifizierten Controller oder Dienst; die Hilfsklasse selbst authentifiziert oder autorisiert die Aufrufer Ihrer Anwendung nicht.

Einmal erstellen und Wiederherstellungsdaten speichern

  1. 1.

    Site, Aktion und Proxy auswählen

    Übergeben Sie den Zielhostnamen als site, nicht als vollständige URL. Dieses Beispiel setzt action fest auf login; ändern Sie den Wert auf die von Ihrem Ziel erwartete Aktion. Es sendet einen Proxy und verwendet den standardmäßigen reCAPTCHA-Modus enterprise-v3. Fügen Sie keine Felder type oder url hinzu.

  2. 2.

    requestId vor dem Aufruf von CreateAsync speichern

    Verwenden Sie 1–64 ASCII-Buchstaben, Ziffern, Unterstriche oder Bindestriche. Speichern Sie die ID zusammen mit den exakten Task-Eingaben, damit Sie denselben logischen Task wiederfinden können, falls die Antwort verloren geht.

  3. 3.

    CreateAsync aufrufen und die zurückgegebene Task-ID speichern

    CreateAsync führt eine POST-Anfrage mit waitMs=0 aus. Übergeben Sie den CancellationToken des Aufrufers. Sobald Sie die Task-ID haben, verwenden Sie GetAsync, um diesen Task abzufragen, statt einen weiteren zu erstellen.

Sichern Sie die Berechtigung zum Verbrauch von Workspace-Guthaben durch die Autorisierungsprüfungen Ihrer Anwendung ab. Wenn diese Werte aus einer eingehenden Anfrage stammen, prüfen Sie die angeforderte Website, Aktion und den Proxy darauf, ob der Aufrufer sie verwenden darf.

Mit einer Gesamtzeitgrenze abfragen

GetAsync maskiert die bekannte Task-ID und fordert waitMs=15000 an. Das HttpClient-Timeout von 25 Sekunden begrenzt jede einzelne HTTP-Anfrage, nicht die gesamte Zeit, die Ihre Anwendung mit Polling verbringt. Legen Sie eine separate Gesamtzeitgrenze fest und reichen Sie das Abbruchsignal bei jedem Aufruf weiter.

  • pending oder solving: Fahren Sie nur fort, solange die Polling-Zeitgrenze und das Abbruchsignal des Aufrufers dies zulassen.
  • ready: Beenden Sie das Polling und lesen Sie die Lösung aus. Dies ist der einzige Status mit einer nutzbaren Lösung.
  • failed: Beenden Sie das Polling und prüfen Sie errorCode und error.

Halten Sie bei einer Anwendung mit Browserzugriff die Erstellung und spätere Statusabfragen als getrennte, geschützte Vorgänge, statt innerhalb einer eingehenden Anfrage eine Schleife auszuführen, bis der Task abgeschlossen ist. Behalten Sie die Task-ID bei, wenn eine lokale Zeitgrenze abläuft, damit eine spätere autorisierte Anfrage den Task abrufen kann.

Verwenden Sie beim Übermitteln des Tokens an sein vorgesehenes Ziel die mit der Lösung zurückgegebene Identität aus userAgent und secChUa sowie denselben Proxy wie beim Lösungsversuch. Ein bereiter Task bedeutet, dass eine Lösung erzeugt wurde – nicht, dass Ihre Anwendungsanfrage erfolgreich war.

Nach einem Timeout wiederherstellen, ohne Arbeit doppelt auszuführen

Bei CreateAsync tritt ein Timeout auf oder der Aufruf wird abgebrochen, bevor Sie eine ID erhalten.

Der Server hat den Task möglicherweise bereits erstellt. Ein lokaler Abbruch beendet die Arbeit auf dem Server nicht.

Probiere Folgendes: Senden Sie zur Wiederherstellung dieselben Task-Eingaben mit der gespeicherten requestId erneut. Dieselbe ID mit denselben Eingaben liefert den vorhandenen Task zurück; geänderte Eingaben bei Wiederverwendung dieser ID führen zu einem Konflikt.

Bei GetAsync tritt ein Timeout auf oder die Polling-Zeitgrenze läuft ab.

Sie haben bereits eine Task-ID; eine fehlende Antwort erfordert daher keinen Ersatz-Task.

Probiere Folgendes: Behalten Sie die ID und fragen Sie diesen Task später in einem neuen, zeitlich begrenzten Vorgang ab.

Der HTTP-Aufruf liefert eine nicht erfolgreiche Antwort zurück.

EnsureSuccessStatusCode löst eine Ausnahme aus, bevor die Hilfsklasse eine Erfolgsantwort liest. Das ist etwas anderes als der Empfang eines Tasks mit dem Status failed.

Probiere Folgendes: Behandeln Sie den HTTP-Fehler separat. Korrigieren Sie ungültige Eingaben, statt sie unverändert erneut zu senden.

Die Aufgabe erreicht den Status failed.

Lesen Sie errorCode und error aus, um den Task-Fehler zu ermitteln, beispielsweise site-unreachable.

Probiere Folgendes: Beenden Sie die Abfragen für diesen Task und beheben Sie die gemeldete Ursache, bevor Sie einen weiteren Lösungsversuch starten.

Nutzen Sie den Leitfaden zu API-Fehlern, wenn Sie zwischen einer abgelehnten API-Anfrage und einem endgültig fehlgeschlagenen Lösungsversuch unterscheiden müssen.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
solvethree aus einem ASP.NET Core-Backend aufrufen · solvethree