ServiceStack устанавливает Response DTO при завершении ответа в фильтре запросов

1

Я использую ServiceStack для создания API. Я хочу выполнить проверку подлинности в Фильтре запросов. Я создал класс, который наследует метод RequestFilterAttribute и overrides

void Execute(IRequest req, IResponse res, object requestDto)

При переопределении, когда аутентификация завершается с ошибкой, я хочу, чтобы запрос не продолжался с помощью метода службы, и я хочу вернуть конкретное сообщение. Для завершения запроса я могу использовать один из следующих способов:

res.Close();
res.End();
res.EndHttpHandlerRequest();
res.EndRequest();
res.EndRequestWithNoContent();

Они предотвращают выполнение метода в сервисе. При завершении ответа я хочу иметь конкретный DTO с сообщением. Поэтому перед окончанием ответа я присваиваю объект DTO свойству

res.Dto = myResponseDto;

Однако результат вызова API не содержит никаких данных. Может ли кто-нибудь помочь с предотвращением в фильтре запроса на выполнение службы ServiceStack, но возвращающего желаемый объект ответа DTO?

Теги:
servicestack

2 ответа

1
Лучший ответ

С фильтрами вы должны обрабатывать исходный ответ. Поэтому, если вы хотите закончить ответ в фильтре и вернуть ответ DTO, вам нужно будет Write объект DTO в ответ до вызова метода EndRequest.

Если вы отправляете Unauthorized ошибку, тогда установка кода состояния на HttpStatusCode.Unauthorized (401) обычно является всем, что требуется клиенту для опознания их запроса.

public override void Execute(IRequest req, IResponse res, object requestDto)
{
    // Perform you filter actions

    if(authorised)
        return;

    // Not authorised, return some object

    var responseDto = new {
        SomeValue = "You are not authorised to do that."
    };

    // Set the status code
    res.StatusCode = (int)HttpStatusCode.Unauthorized;

    // You may need to handle other return types based on 'req.AcceptTypes'
    // This example assumes JSON response.

    // Set the content type
    res.ContentType = "application/json";

    // Write the object
    res.Write(responseDto.toJson());

    // End the request
    req.EndRequest();
}

Надеюсь, это поможет.

  • 0
    Спасибо за быстрый ответ! Это решает мою проблему, хотя я думал, что есть способ сделать это автоматически, как и большинство вещей в ServiceStack. Таким образом, я должен позаботиться о различных типах содержимого ответа, которые поддерживает мой API. Однако это работает. Спасибо!
1

Вы можете использовать следующие инструкции, где res.Dto можно изменить на все, что вам хочется:

res.ContentType = req.ResponseContentType;
res.StatusCode = (int)HttpStatusCode.Unauthorized;
res.Dto = DtoUtils.CreateResponseDto(requestDto, new ResponseStatus("401", "Unauthorized"));
res.EndRequest();

Если вам не требуется вставлять данные в ответ, вы можете просто использовать throw new AuthenticationException("Error reason"); в вашем фильтре.

  • 1
    Я пробовал это, но это не работает. Я получаю Content-Length: 0 и нет ответа

Ещё вопросы

Сообщество Overcoder
Наверх
Меню