У меня есть базовая служба ASP.NET, которая выдает ответы в формате JSON и XML. Однако мне нравится ограничивать принятый тип носителя только одним действием, поэтому Swagger может указывать только application / json как допустимый тип содержимого ответа . Как я могу добиться этого в ASP.Net Core?
Пожалуйста, учтите, что я использую ASP.Net Core (ASP.NET MVC 6), а не ASP.NET WebAPI.
UPDATE
Хорошо, поэтому я добавлю ответ как часть того же вопроса. Благодаря @ Helen я смог добавить необходимые классы для достижения этой цели в ASP.Net Core (ASP.Net MVC 6). Ответ основан на этом ответе , но изменен для использования базовых классов ASP.NET.
Шаг 1. Создайте атрибут фильтра настраиваемого действия, чтобы конвейер реагировал на запрещенный тип содержимого:
/// <summary>
/// SwaggerResponseContentTypeAttribute
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public sealed class SwaggerResponseContentTypeAttribute : ActionFilterAttribute
{
/// <summary>
/// SwaggerResponseContentTypeAttribute
/// </summary>
/// <param name="responseType"></param>
public SwaggerResponseContentTypeAttribute(string responseType)
{
ResponseType = responseType;
}
/// <summary>
/// Response Content Type
/// </summary>
public string ResponseType { get; private set; }
/// <summary>
/// Remove all other Response Content Types
/// </summary>
public bool Exclusive { get; set; }
public override void OnActionExecuting(ActionExecutingContext context)
{
var accept = context.HttpContext.Request.Headers["accept"];
var accepted = accept.ToString().ToLower().Contains(ResponseType.ToLower());
if (!accepted)
context.Result = new StatusCodeResult((int)HttpStatusCode.NotAcceptable);
}
}
Шаг 2 . Создайте фильтр операций Swagger, чтобы пользовательский интерфейс мог отражать ограничение
public class ResponseContentTypeOperationFilter : IOperationFilter
{
public void Apply(Swashbuckle.AspNetCore.Swagger.Operation operation, OperationFilterContext context)
{
var requestAttributes = context.ControllerActionDescriptor.GetControllerAndActionAttributes(true).Where(c=>c.GetType().IsAssignableFrom(typeof(SwaggerResponseContentTypeAttribute))).Select(c=> c as SwaggerResponseContentTypeAttribute).FirstOrDefault();
if (requestAttributes != null)
{
if (requestAttributes.Exclusive)
operation.Produces.Clear();
operation.Produces.Add(requestAttributes.ResponseType);
}
}
}
Шаг 3. Сконфигурируйте службу пользовательского интерфейса Swagger в Startup.cs, внутри метода ConfigureServices, чтобы он мог использовать только что созданный Фильтр операций.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
c.OperationFilter<ResponseContentTypeOperationFilter>();
});
}
Шаг 4 . Аннотировать действие
// GET api/values
[HttpGet]
[WebService.Utils.SwaggerResponseContentType(responseType: "application/json", Exclusive = true)]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}