Windows环境下Pact Provider测试返回400,OSX下正常
问题描述
使用PactNet 4.3.0运行示例代码,仅修改了测试逻辑:未使用Provider States,而是在控制器中设置所需状态。代码在OSX上运行正常,但在Windows Server 2019 Standard环境中执行时出现Pact验证失败错误,返回400状态码,响应Content-Type为text/html而非预期的application/json; charset=utf-8。使用.NET 7开发,已尝试引入PactNet.Windows NuGet包但未解决问题,也排除了Windows长路径问题,寻求相关解决建议。
错误详情
PactNet.Exceptions.PactFailureException: Pact verification failed PactNet.Exceptions.PactFailureException Pact verification failed at PactNet.Verifier.InteropVerifierProvider.Execute() at PactNet.Verifier.PactVerifierSource.Verify() at tests.ProductApiTestsWithoutBroker.EnsureProviderApiHonoursPactWithConsumer() in C:\repos\ProofOfConcepts\Pact-Product-api\ProviderTests\ProductApiTestsWithoutBroker.cs:line 47 at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr) Getting to pact verification Starting verification... Pact verification failed Verifier Output --------------- Verifying a pact between ApiClient and ProductService A valid request for all products returns a response which has status code 200 (FAILED) includes headers "Content-Type" with value "application/json; charset=utf-8" (FAILED) has a matching body (FAILED) Failures: 1) Verifying a pact between ApiClient and ProductService - A valid request for all products 1.1) has a matching body expected 'application/json;charset=utf-8' body but was 'text/html' 1.2) has status code 200 expected 200 but was 400 1.3) includes header 'Content-Type' with value 'application/json; charset=utf-8' Expected header 'Content-Type' to have value 'application/json; charset=utf-8' but was 'text/html' There were 1 pact failures Verifier Logs ------------- 2023-02-14T20:36:14.433512Z INFO ThreadId(33) pact_verifier: Running provider verification for 'A valid request for all products' 2023-02-14T20:36:14.433752Z INFO ThreadId(33) pact_verifier::provider_client: Sending request to provider at http://localhost:9001/ 2023-02-14T20:36:14.433771Z INFO ThreadId(33) pact_verifier::provider_client: Sending request HTTP Request ( method: GET, path: /api/products, query: None, headers: None, body: Missing ) 2023-02-14T20:36:14.456312Z INFO ThreadId(33) pact_verifier::provider_client: Received response: HTTP Response ( status: 400, headers: Some({"cache-control": ["no-store"], "via": ["1.1 ForcepointCGCluster"], "date": ["Tue", "14 Feb 2023 20:36:32 GMT"], "content-type": ["text/html"], "connection": ["close"], "content-language": ["en"], "content-length": ["666"]}), body: Present(666 bytes, text/html) ) 2023-02-14T20:36:14.456421Z INFO ThreadId(33) pact_matching: comparing to expected response: HTTP Response ( status: 200, headers: Some({"Content-Type": ["application/json; charset=utf-8"]}), body: Present(130 bytes) ) 2023-02-14T20:36:14.457552Z WARN ThreadId(33) pact_matching::metrics: Please note: We are tracking events anonymously to gather important usage statistics like Pact version and operating system. To disable tracking, set the 'PACT_DO_NOT_TRACK' environment variable to 'true'. 2023-02-14T20:36:14.495312Z WARN ThreadId(33) rustls::conn: Sending fatal alert DecodeError
排查与解决建议
- 检查请求路由匹配:Windows环境下ASP.NET Core路由可能存在大小写敏感差异,确认Pact中定义的请求路径(
/api/products)与控制器路由完全一致,包括大小写 - 获取并分析text/html响应内容:400返回的HTML页面通常包含具体错误信息(如路由匹配失败、模型验证错误等),可在测试代码中临时添加逻辑捕获该响应内容,或手动访问
http://localhost:9001/api/products查看实际返回结果 - 排查代理/防火墙拦截:从日志中看到响应包含
via: ["1.1 ForcepointCGCluster"],说明请求可能经过了代理服务器,代理可能篡改请求或返回拦截页面。需确保测试请求直接指向本地服务,可配置本地环境跳过代理(如设置NO_PROXY=localhost,127.0.0.1) - 确认服务启动状态:测试执行前,确保本地服务已正常启动并绑定到
localhost:9001端口,可通过浏览器或curl工具验证服务可用性 - 检查环境配置差异:对比OSX与Windows Server的.NET环境变量(如
ASPNETCORE_ENVIRONMENT),不同环境可能加载不同配置(如生产环境启用了额外的安全验证中间件) - 验证PactNet版本兼容性:确认PactNet.Windows NuGet包版本与PactNet 4.3.0完全兼容,若存在版本 mismatch,尝试更新到匹配版本
内容的提问来源于stack exchange,提问作者agoyal
相关产品推荐
相关产品推荐

