如何在 .NET Web API 应用程序中将 FluentValidation 与 Swagger 一起使用?
How do I use FluentValidation alongside Swagger in .NET Web API application?
我有一个 .NET Web API 项目。我能够通过安装 Swashbuckle NuGet 包来添加 Swagger。 Swagger 现在制作了一个漂亮的网页,通过转到此 url 提供文档和测试能力:
http://localhost:20475/product-catalog-api/swagger/ui/index
这部分效果很好。但是,当我添加 FluentValidation 并在 WebApiConfig.cs 中进行设置时,对我站点的所有请求都被劫持了,我没有看到 Swagger html 页面,而是只得到 JSON 空响应。
我使用了 Matthew Jones 的这篇文章来设置 FluentValidation:
http://www.exceptionnotfound.net/custom-validation-in-asp-net-web-api-with-fluentvalidation/
这是我的网络 api 配置的样子:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.Filters.Add(new ValidateModelStateFilter());
config.MessageHandlers.Add(new ResponseWrappingHandler());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: Version + "/{action}",
defaults: new {controller = "Main"}
);
FluentValidationModelValidatorProvider.Configure(config);
}
我可以在每个 Web 服务方法中手动触发 FluentValidation,但我希望有一个通用的解决方案,就像 Matthew Jones 对 Filters 和 MessageHandlers 所做的那样。基本上我想做的是说如果请求是针对 swagger-ui 然后不要通过 FluentValidation 路由。
我最终在 ResponseWrappingHandler
中添加了这段代码。可能有更优雅的方式,但这对我有用。这会导致 swagger 页面请求踢出 FluentValidation 挂钩。
if (request.RequestUri.AbsolutePath.Contains("swagger"))
{
return response;
}
我有一个 .NET Web API 项目。我能够通过安装 Swashbuckle NuGet 包来添加 Swagger。 Swagger 现在制作了一个漂亮的网页,通过转到此 url 提供文档和测试能力:
http://localhost:20475/product-catalog-api/swagger/ui/index
这部分效果很好。但是,当我添加 FluentValidation 并在 WebApiConfig.cs 中进行设置时,对我站点的所有请求都被劫持了,我没有看到 Swagger html 页面,而是只得到 JSON 空响应。
我使用了 Matthew Jones 的这篇文章来设置 FluentValidation: http://www.exceptionnotfound.net/custom-validation-in-asp-net-web-api-with-fluentvalidation/
这是我的网络 api 配置的样子:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.Filters.Add(new ValidateModelStateFilter());
config.MessageHandlers.Add(new ResponseWrappingHandler());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: Version + "/{action}",
defaults: new {controller = "Main"}
);
FluentValidationModelValidatorProvider.Configure(config);
}
我可以在每个 Web 服务方法中手动触发 FluentValidation,但我希望有一个通用的解决方案,就像 Matthew Jones 对 Filters 和 MessageHandlers 所做的那样。基本上我想做的是说如果请求是针对 swagger-ui 然后不要通过 FluentValidation 路由。
我最终在 ResponseWrappingHandler
中添加了这段代码。可能有更优雅的方式,但这对我有用。这会导致 swagger 页面请求踢出 FluentValidation 挂钩。
if (request.RequestUri.AbsolutePath.Contains("swagger"))
{
return response;
}