Ошибка сериализации при получении ответа об ошибке

#c# #servicestack

#c# #servicestack

Вопрос:

Я получаю сообщение об ошибке и не могу понять, что я делаю не так:

 "Type definitions should start with a '{', expecting serialized type 'MessageHistoryResponse', got string starting with: 
<!DOCTYPE html>
<html>
<head>
    <meta name=" ...
  

Клиентский код является простым:

 var client = new JsonServiceClient(Url);

try
{
    var messageHistoryResponse = client.Send(new MessageHistory {
        Take = 20,
        Skip = 0
    });
}
catch (WebServiceException e)
{
    Console.WriteLine(e);
}
  

У меня есть фильтр запросов следующим образом:

 public override void Execute(IRequest req, IResponse res, object requestDto)
{
    var token = req.Headers["authtoken"];

    if (token != null)
    {
        //Authenticated code
    }

    if (_logger.IsDebugEnabled)
        _logger.DebugFormat("[Token {0}] Access Denied", token);

    res.ReturnAuthRequired();
}
  

Это соответствует одному из примеров, но вместо получения WebException он выдает исключение сериализации. Я не уверен, как лучше всего с этим справиться?

Все мои сервисы используют стандартный шаблон RequestDto /responseDto. Из документов я ожидал, что будет выдано WebException , с которым я мог бы затем справиться. Но вместо этого это SerializationException и не сообщает о сбое аутентификации.

У кого-нибудь есть идеи, как мне помочь?

Ответ №1:

Ваш фильтр не установил тип содержимого равным application/json , поэтому несанкционированная ошибка выводится в виде html, чего JsonServiceClient не ожидается.

Вы можете задать тип ответа, а затем throw ошибку

 public override void Execute(IRequest req, IResponse res, object requestDto)
{
    ...
    res.ContentType = "application/json";
    throw new HttpError(System.Net.HttpStatusCode.Unauthorized, "401", "Invalid token, access denied");
}
  

Комментарии:

1. Спасибо за ответ. Когда я настраиваю службу, я использую следующий код: JsConfig.EmitCamelCaseNames = true; JsConfig. DateHandler = Обработчик даты. ISO8601; SetConfig(новый HostConfig { HandlerFactoryPath = «api», DefaultContentType = MimeTypes. Json }); Разве это не формат возврата по умолчанию в JSON?

2. @Dion Добро пожаловать, я надеюсь, это поможет. MimeTypes.Json Будет применяться только к типу возвращаемого значения методов сервисного действия, оно не применяется к фильтрам, поскольку фильтры предназначены для обработки необработанного запроса.

3. @Dion это предложение решило вашу проблему? Или вы все еще видите ошибку?

4. Я только что попробовал ваше предложение, и, к сожалению, оно ничего не изменило. Возвращается та же ошибка.

5. @Dion Какой ответ вы получаете, когда делаете запрос через веб-браузер? т. Е. делаете что-то вроде http://<server>:<port>/<MessageHistoryAction>/?Take=20amp;Skip=0amp;x-http-method-override=POST

Ответ №2:

Мне удалось найти ответ с помощью форумов. Проблема, с которой я столкнулся, была вызвана конфликтом между поставщиком членства в ASP .NET и ServiceStack. Когда был получен 401 несанкционированный ответ, ASP .NET перехватывает запрос и принимает управление.

Я изменил свой код, чтобы вместо этого возвращать 403 Forbidden, и я вернулся к работе.

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

Спасибо за вашу помощь.