Удалите тип носителя из метода контроллера - PullRequest
1 голос
/ 19 июня 2019

У меня есть контроллер с несколькими методами получения, которые выдают application/vnd.api+json и application/json. У меня есть один метод исправления, который поддерживает application/json-patch+json.

Чтобы избежать повторяющихся атрибутов метода get, у меня есть [Produces] на уровне класса

[Produces("application/json", "application/vnd.api+json")]
public class ValuesController : Controller
{ ... }

Это хорошо, но, глядя на страницу документации Swagger UI, которая генерируется, патч говорит, что поддерживает все 3 типа мультимедиа, описанные выше, что неправильно.

Итак, я хочу удалить два метода, которые применяются к методу исправления. Я попытался создать противоположность [Produces].

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DoesNotProduceAttribute : Attribute, IApiDefaultResponseMetadataProvider, IOrderedFilter
{
    public DoesNotProduceAttribute(string contentTypeToRemove, params string[] otherContentTypesToRemove)
    {
        ContentTypes.Add(contentTypeToRemove);
        otherContentTypesToRemove.ForEach(ContentTypes.Add);
    }

    public void SetContentTypes(MediaTypeCollection contentTypes)
    {
        foreach (var contentType in ContentTypes)
            contentTypes.Remove(contentType);
    }

    public MediaTypeCollection ContentTypes { get; } = new MediaTypeCollection();
    ...
}

и примените это к моему методу

[HttpPatch("{id}")]
[DoesNotProduce("application/json", "application/vnd.api+json")]
public async Task<IActionResult> Update(string id, [FromBody]JsonPatchDocument<Value> patchDocument)
{ ... }

Однако метод SetContentTypes() не вызывается. Что мне не хватает? Есть ли другой способ удаления типов содержимого, которые я не хочу использовать для метода исправлений?

1 Ответ

1 голос
/ 19 июня 2019

Вы можете использовать ResultFilterAttribute и переопределить метод OnResultExecuted, который запускается сразу после выполнения действия.Таким образом вы удаляете типы контента из ObjectResult, возвращенного обратно потребителю API.

Фильтр:

public class RemoveContentTypeAttribute : ResultFilterAttribute {
    public MediaTypeCollection ContentTypes { get; } = new MediaTypeCollection();

    public RemoveContentTypeAttribute(string contentType, params string[] otherContentTypes) {
        ContentTypes.Add(contentType);
        foreach (var currentContentType in otherContentTypes) {
            ContentTypes.Add(currentContentType);
        }
    }

    public override void OnResultExecuted(ResultExecutedContext context) {
        var result = (ObjectResult)context.Result;
        foreach (var contentType in ContentTypes) {
            result.ContentTypes.Remove(contentType);
        }
    }
}

Контроллер

[RemoveContentType("application/json", "application/vnd.api+json")]
public async Task<IActionResult> Update(string id, [FromBody]JsonPatchDocument<Value> patchDocument)
{ ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...