ServiceStack Json使用错误的Content-Type反序列化

时间:2013-06-17 19:15:31

标签: servicestack

尝试使用ServiceStack 3.9.49和CORS进行设置。

一个简单的Echo服务,它将POST ed数据返回++。代码:

[Route("/echo")]
public class EchoRequest
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

public class RequestResponse
{
    public string Name { get; set; }
    public int? Age { get; set; }
    public string RemoteIp { get; set; }
    public string HttpMethod { get; set; }
}

public class EchoService : Service
{
    public RequestResponse Any(EchoRequest request)
    {
        var response = new RequestResponse
            {
                Age = request.Age,
                Name = request.Name,
                HttpMethod = base.Request.HttpMethod,
                RemoteIp = base.Request.RemoteIp
            };
        return response;
    }
}

AppHost Configure代码:

public override void Configure(Container container)
{
    ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

    SetConfig(new EndpointHostConfig
    {
        DefaultContentType = ContentType.Json,
        GlobalResponseHeaders = new Dictionary<string, string>(),
        DebugMode = true
    });

    Plugins.Add(new CorsFeature());

    PreRequestFilters.Add((httpRequest, httpResponse) => {
        //Handles Request and closes Responses after emitting global HTTP Headers
        if (httpRequest.HttpMethod == "OPTIONS")
            httpResponse.EndServiceStackRequest();
    });

    RequestFilters.Add((httpRequest, httpResponse, dto) =>
    {
        httpResponse.AddHeader("Cache-Control", "no-cache");
    });
}

使用Content-Type:application / json发送POST(身体中有json对象)时,一切都很好。

但是,在发送相同内容并将Content-Type设置为text/plain时,会调用正确的方法,但EchoRequest中的数据为null

这是正确的行为吗?如果json对象作为Content-Type发送,application/json必须设置为POST吗?

是的,是否有可能以某种方式覆盖它,例如在网址?根据我的理解,在url中使用?format = json,只会影响返回的数据...

最后一个问题,是否有可能在反序列化到方法之前修改请求的Content-Type标题,某处,如下所示:

if (httpRequest.ContentType == "text/plain")
    httpRequest.Headers["Content-Type"] = ContentType.Json;

1 个答案:

答案 0 :(得分:3)

反序列化为空对象是ServiceStack序列化程序的正确行为。它往往是非常宽容的。它创建一个空的反序列化对象并继续用它从输入中解析的任何东西进行水合,这意味着如果你给它垃圾数据,你将得到一个空对象。

您可以通过在AppHost配置中指定以下选项来减少序列化程序:

ServiceStack.Text.JsConfig.ThrowOnDeserializationError = true;

我不知道有任何修改URL的方法来向ServiceStack表明请求是JSON格式的。此外,在反序列化之前,ServiceStack内部没有任何方法可以修改内容类型。甚至指定一个PreRequestFilter来修改之前的标题将不起作用,因为已经设置了请求的ContentType属性并且是readonly。

PreRequestFilters.Add((req, res) => req.Headers["Content-Type"] = "application/json");