Appeler solvethree depuis un backend ASP.NET Core

Par solvethree5 min de lecture

Enregistrez un HttpClient typé, créez une seule fois la tâche, puis récupérez son état avec une échéance définie. Conservez la clé API sur le serveur et protégez toutes les routes de l’application qui appellent le client.

L’exemple ci-dessous est une classe utilitaire REST pour reCAPTCHA Enterprise, et non un SDK C# officiel. Elle sépare la création et la récupération des tâches pour que votre application n’ait pas à maintenir une requête entrante ouverte jusqu’à la fin de la résolution.

Sur cette page

Enregistrer le client typé

Commencez par activer le profil du site cible pour votre espace de travail dans la console. L’envoi d’un nom d’hôte et d’une action n’en crée pas. Consultez la configuration du profil de site si le site n’est pas encore configuré.

Placez la clé de l’espace de travail dans la configuration du serveur sous le nom SOLVETHREE_API_KEY. Ajoutez la classe du client, puis décommentez l’enregistrement présenté sous Program.cs et placez-le avant builder.Build().

ASP.NET Core · un client HTTP typé
// 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.

L’enregistrement définit l’adresse de base de l’API, l’authentification Bearer et un délai de transport de 25 secondes, et désactive les redirections automatiques. Conservez la barre oblique finale de l’adresse de base : les chemins relatifs tasks du client doivent être résolus sous /v1/.

La classe utilitaire utilise les extensions JSON de HttpClient et renvoie un JsonObject. Les deux méthodes vérifient le succès HTTP avant la désérialisation. Injectez CaptchaClient dans un contrôleur ou un service authentifié ; la classe utilitaire elle-même n’authentifie pas les appelants de votre application et ne gère pas leurs autorisations.

Créer une seule fois et enregistrer les informations de récupération

  1. 1.

    Choisir le site, l’action et le proxy

    Transmettez le nom d’hôte cible dans site, et non une URL complète. Cet exemple fixe action à login ; remplacez cette valeur par l’action attendue par votre cible. Il envoie un seul proxy et utilise le mode reCAPTCHA par défaut enterprise-v3. N’ajoutez pas de champs type ou url.

  2. 2.

    Enregistrer un requestId avant d’appeler CreateAsync

    Utilisez 1–64 lettres ASCII, chiffres, traits de soulignement ou traits d’union. Enregistrez cet identifiant avec les paramètres exacts de la tâche pour pouvoir retrouver la même tâche logique si la réponse est perdue.

  3. 3.

    Appeler CreateAsync et enregistrer l’ID de tâche renvoyé

    CreateAsync effectue un seul POST avec waitMs=0. Transmettez le CancellationToken de l’appelant. Une fois l’ID de tâche obtenu, utilisez GetAsync pour récupérer cette tâche plutôt que d’en créer une autre.

Soumettez la possibilité de dépenser les crédits de l’espace de travail aux contrôles d’autorisation de votre application. Si ces valeurs proviennent d’une requête entrante, vérifiez que le site, l’action et le proxy demandés font partie de ceux que cet appelant est autorisé à utiliser.

Interroger avec une échéance globale

GetAsync échappe l’ID de tâche connu et demande waitMs=15000. Le délai HttpClient de 25 secondes limite chaque requête HTTP ; il ne limite pas la durée totale pendant laquelle votre application interroge l’état de la tâche. Définissez une échéance globale distincte et propagez l’annulation à chaque appel.

  • pending ou solving : continuez uniquement tant que l’échéance d’interrogation et l’annulation par l’appelant le permettent.
  • ready : cessez les interrogations et lisez la solution. C’est le seul état qui comporte une solution utilisable.
  • failed : arrêtez l’interrogation et examinez errorCode et error.

Pour une application accessible depuis un navigateur, gardez la création et les vérifications d’état ultérieures sous forme d’opérations distinctes et protégées, plutôt que de boucler au sein d’une seule requête entrante jusqu’à la fin de la tâche. Conservez l’ID de tâche lorsqu’une échéance locale expire, afin qu’une requête autorisée ultérieure puisse récupérer la tâche.

Lorsque vous soumettez le jeton à sa cible prévue, utilisez l’identité userAgent et secChUa renvoyée dans la solution et le même proxy que celui utilisé pour la résolution. Une tâche prête signifie qu’une solution a été générée, et non que la requête de votre application a réussi.

Récupérer après une expiration de délai sans créer de doublon

CreateAsync expire ou est annulé avant que vous ne receviez un ID.

Le serveur peut déjà avoir créé la tâche. Une annulation locale n’annule pas le travail distant.

Essayez ceci : Retrouvez la tâche en renvoyant les mêmes paramètres avec le requestId enregistré. Le même ID et les mêmes paramètres renvoient la tâche existante ; modifier les paramètres tout en réutilisant cet ID provoque un conflit.

GetAsync expire ou l’échéance d’interrogation est atteinte.

Vous disposez déjà d’un ID de tâche ; l’absence de réponse ne nécessite donc pas de tâche de remplacement.

Essayez ceci : Conservez l’ID et récupérez cette tâche plus tard dans le cadre d’une nouvelle opération limitée dans le temps.

L’appel HTTP renvoie une réponse qui n’indique pas un succès.

EnsureSuccessStatusCode lève une exception avant que la classe utilitaire ne lise un corps de réponse de succès. Cela diffère de la réception d’une tâche dont l’état est failed.

Essayez ceci : Traitez l’erreur HTTP séparément. Corrigez les paramètres non valides plutôt que de les renvoyer sans modification.

La tâche passe à l’état failed.

Lisez errorCode et error pour connaître l’échec de la tâche, par exemple site-unreachable.

Essayez ceci : Cessez d’interroger cette tâche et corrigez la cause signalée avant de lancer une autre résolution.

Consultez le guide des erreurs de l’API pour distinguer une requête API rejetée d’un échec terminal de résolution.

Lancez votre première tâche.

Démarrez avec $5 de crédit dans votre espace de travail.

Créer un espace de travail
Appeler solvethree depuis un backend ASP.NET Core · solvethree