#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, и я вернулся к работе.
Это так неприятно, но я рад, что в конце концов мы смогли докопаться до сути.
Спасибо за вашу помощь.