获取错误响应时出现序列化错误

时间:2014-07-05 08:38:16

标签: 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并且没有报告Auth失败。

有人有任何想法可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

您的过滤器未将内容类型设置为application/json,因此未经授权的错误将输出为JsonServiceClient不期望的html。

您可以设置响应类型,然后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 :(得分:1)

我在论坛的帮助下找到了答案。我遇到的问题是由于ASP .NET成员资格提供程序和ServiceStack之间的冲突。收到401 Unauthorized响应后,ASP .NET会劫持该请求并接管。

我改变了我的代码而不是返回403 Forbidden,我又回来了。

令人沮丧,但我很高兴我们最终能够深入了解它。

感谢您的帮助。