web-dev-qa-db-fra.com

Les clients ne peuvent pas se connecter au serveur pendant les tests Selenium

Je travaille sur des tests Selenium (écrits en C # à l'aide du Webdriver chrome) pour une application Web JavaScript qui utilise un serveur dorsal s'exécutant sur WebApi 5.2.4. CORS est activé avec des paramètres très permissifs:

namespace SealingService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            // etc...
        }
    }
}

Normalement, tout fonctionne comme prévu. Mais sur certaines machines, lorsque le serveur est démarré par les scripts de test, le client rencontre des erreurs CORS à chaque requête. La console de développement de chrome affiche le message standard Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.. Les journaux du serveur indiquent que les demandes OPTION parviennent à destination et envoie une réponse.

Lorsque j'essaie d'accéder manuellement à l'un des itinéraires de l'API, le serveur renvoie la page générique ASP.NET 404. Cela me fait penser que notre configuration CORS pourrait en fait fonctionner correctement, mais que le script de test ne démarre pas/ne configure pas correctement le serveur. Par conséquent, les itinéraires ne sont pas enregistrés. Ainsi, tous les itinéraires d'API renvoient la page 404, qui n'est évidemment pas activée par CORS.

Il s'agit du fichier applicationhost.config utilisé par IIS lors des tests. Voici comment le serveur est démarré par le script de test:

public static Process StartIIS(string siteName)
{
    return Process.Start(@"C:\Program Files (x86)\IIS Express\iisexpress.exe", $"/site:{siteName} /config:{_applicationHostConfigFilePath}");
}

Les erreurs ne se produisent que sur certaines machines et nous ne pouvons pas déterminer ce qui est configuré différemment entre elles. J'ai essayé d'utiliser l'indicateur --disable-web-security de Chrome, mais cela ne semble pas faire de différence.

15
David Reed

Vous pouvez généralement résoudre les erreurs de pré-vol en modifiant votre web.config:

<system.webServer>

    ...

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Cache-Control" />
        <add name="Access-Control-Allow-Credentials" value="true" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
</httpProtocol>
</system.webServer>

Ou via le code dans un gestionnaire personnalisé avec quelque chose comme:

if (request.Headers.Contains("Origin") && request.Method.Method == "OPTIONS")
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    response.Headers.Add("Access-Control-Allow-Origin", "*");
    response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");       
    response.Headers.Add("Access-Control-Allow-Methods", "DELETE, POST, PUT, OPTIONS, GET");
}

Si cela fonctionne, vous pouvez alors essayer d'affiner les choses, par exemple. changer Access-Control-Allow-Origin uniquement à votre adresse frontale.

1
Ben Hall

En supposant que vous utilisez Windows OS. Si oui, avez-vous laissé votre application contourner le pare-feu Windows? ex: si vous avez une application s'exécutant sur localhost: 9000, vous devez vous assurer que le pare-feu Windows a des règles pour autoriser le port 9000.

J'espère que cela résout votre problème. 

0
Kiran Dudyala