2

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

一个简单的Echo服务,它返回POSTed 数据返回++。编码:

[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;
    }
}

应用主机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-Typetext/plain,会调用正确的方法,但 中的数据EchoRequestnull

这是正确的行为吗?如果 json对象Content-Type作为?application/jsonPOST

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

最后一个问题,是否可以Content-Type在反序列化为方法之前修改请求的标头,例如:

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

1 回答 1

3

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

您可以通过在 AppHost 配置中指定以下选项来降低序列化程序的容错性:

ServiceStack.Text.JsConfig.ThrowOnDeserializationError = true;

我不知道有什么方法可以修改 URL 以向 ServiceStack 表明请求是 JSON 格式。此外,ServiceStack 内部似乎没有任何方法可以在反序列化之前修改内容类型。即使之前指定 PreRequestFilter 来修改标头也不起作用,因为请求的 ContentType 属性已设置并且是只读的。

PreRequestFilters.Add((req, res) => req.Headers["Content-Type"] = "application/json");
于 2014-03-20T22:50:09.617 回答