Примеры Swashbucket .NET Framework SwaggerRequestExample выдает исключение System.ArgumentNullException
Я использую Swashbucket и Swashbucket.Examples NugetPackages для предоставления Swagger API в.NET Framework (v.4.7.2)
Следуя документации на https://github.com/mattfrear/Swashbuckle.AspNetCore.Filters, я пытаюсь использовать атрибут SwaggerRequestExample следующим образом:
[HttpPost]
[Route("search")]
[SwaggerRequestExample(typeof(OrderRequestExample), typeof(OrderRequestExampleProvider))]
public async Task<HttpResponseMessage> SearchAsync()
{
...
}
Мой класс Startup настроен, как описано в документации:
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "MyApi");
c.OperationFilter<ExamplesOperationFilter>();
c.IncludeXmlComments(System.String.Format(@"{0}\bin\MyApi_Api.xml",
System.AppDomain.CurrentDomain.BaseDirectory));
//c.OperationFilter<AddResponseHeadersFilter>();
}).EnableSwaggerUi(c => { c.DocumentTitle("My API");});
Когда я использую атрибут SwaggerRequestExample, пользовательский интерфейс отображает ошибку:
500 : {"Message":"An error has occurred.","ExceptionMessage":"Der Wert darf nicht NULL sein.\r\nParametername: source","ExceptionType":"System.ArgumentNullException","StackTrace":" bei System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)\r\n bei Swashbuckle.Examples.ExamplesOperationFilter.SetRequestModelExamples(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)\r\n bei Swashbuckle.Examples.ExamplesOperationFilter.Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)\r\n bei Swashbuckle.Swagger.SwaggerGenerator.CreateOperation(ApiDescription apiDesc, SchemaRegistry schemaRegistry)\r\n bei Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable`1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n bei Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping`2 group)\r\n bei System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)\r\n bei Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion)\r\n bei Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n bei System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n bei System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n bei System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n bei System.Web.Http.HttpServer.<SendAsync>d__24.MoveNext()"} https://localhost:44384/swagger/docs/v1
очевидно, что "источник" (IEnumerable) отсутствует (null). Не могу найти, куда это добавить.
Примеры классов:
public class OrderRequestExampleProvider : IExamplesProvider
{
public object GetExamples()
{
return new OrderRequestExample()
{
Name = "some name"
};
}
}
public class OrderRequestExample
{
public string Name { get; set; }
}
1 ответ
Решение кажется очевидным, но если вы не используете десериализацию тела в сигнатуре метода, вы получите эту ошибку.
После добавления объекта запроса в сигнатуру метода исключение не возникает.
public async Task<HttpResponseMessage> SearchAsync([FromBody]OrderRequestExample request) {
...
}