客户端在selenium测试期间无法连接到服务器

Dav*_*eed 16 c# selenium google-chrome cors asp.net-web-api

我正在研究使用在WebApi 5.2.4上运行的后端服务器的javascript Web应用程序进行的selenium测试(使用chrome webdriver用C#编写).它是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...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通常一切都按预期工作.但是在某些机器上,当测试脚本启动服务器时,客户端会在每次请求时遇到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.消息.服务器日志显示OPTION请求正在到达它,并且它正在发送响应.

当我尝试手动访问任何API路由时,服务器返回通用的ASP.NET 404页面.这让我觉得我们的CORS配置实际上可以正常工作,但是我们的测试脚本没有正确启动/配置服务器,因此路由没有被注册.因此,所有API路由都返回404页面,这显然不是CORS启用的.

这是IIS在测试期间使用的applicationhost.config. 这是测试脚本启动服务器的方式:

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

这些错误只发生在某些机器上,我们无法弄清楚它们之间的配置有何不同.我尝试过使用Chrome的--disable-web-security旗帜,但似乎没有任何区别.

Ben*_*all 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>
Run Code Online (Sandbox Code Playgroud)

或者通过自定义处理程序中的代码,例如:

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");
}
Run Code Online (Sandbox Code Playgroud)

如果它有效,您可以尝试通过更改Access-Control-Allow-Origin为前端地址来改进内容。