Клиенты не могут подключиться к серверу во время тестов на селен

Я работаю над селенными тестами (написанными на С# с помощью хром-webdriver) для веб-приложения javascript, использующего серверный сервер, работающий на WebApi 5.2.4. Это CORS с очень разрешительными настройками:

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...
        }
    }
}

Обычно все работает так, как ожидалось. Но на некоторых машинах, когда сервер запускается тестовыми сценариями, клиент сталкивается с ошибками CORS при каждом запросе. Консоль chrome dev показывает, что стандартный Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. предварительной Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. сообщение. Журналы сервера показывают, что запросы OPTION доходят до него, и он отправляет ответ.

Когда я пытаюсь получить доступ к любому из маршрутов API вручную, сервер возвращает общую страницу ASP.NET 404. Это заставляет меня думать, что наша конфигурация CORS действительно может работать правильно, но сервер не запускается/не настроен правильно с помощью нашего тестового скрипта, поэтому маршруты не регистрируются. Таким образом, все маршруты API возвращают страницу 404, которая, очевидно, не поддерживает CORS.

Это applicationhost.config, используемый IIS во время тестов. Таким образом, сервер запускается тестовым скриптом:

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

Ошибки возникают только на некоторых машинах, и мы не можем понять, что между ними настроено по-разному. Я пробовал использовать флаг Chrome --disable-web-security но, похоже, это не имеет никакого значения.

Ответ 1

Обычно вы можете решить предполетные ошибки с изменением вашего 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>

Или через код в пользовательском обработчике с чем-то вроде:

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");
}

Если это сработает, вы можете попробовать уточнить вещи, например, изменив Access-Control-Allow-Origin только на свой адрес переднего плана.

Ответ 2

Предполагая, что вы используете ОС Windows. Если да, то разрешили ли ваше приложение обходить брандмауэр Windows.? ex: если у вас есть приложение, работающее на localhost: 9000, то вам нужно убедиться, что брандмауэр Windows имеет правила, позволяющие порт 9000.

Надеюсь, это решит вашу проблему.