0

如何配置 ServiceStack v3.xJsonServiceClient以序列化空请求对象并调用服务?

我想得到一个例外,而是JsonServiceClient返回null。我在服务的顶部放了一个断点,它从来没有命中。但是当 name 属性不为空时,它会被命中。

结果消息:

Expected: <ServiceStack.ServiceClient.Web.WebServiceException>
But was: null

这是失败的测试,它不会引发任何前任。

[Test]
public void TestPortfolioBlankNameE2E()
{
    JsConfig.IncludeNullValues = true;
    var client = TestHelpers.ISWJsonServiceClient();
    GetPortfolio request = "{\"name\":\"\"}".FromJson<GetPortfolio>();
    WebServiceException ex = 
           (WebServiceException)Assert.Throws(typeof(WebServiceException), 
           delegate { client.Get(request); });

    Assert.AreEqual(400, ex.StatusCode);
    Assert.AreEqual("Bad Request", ex.StatusDescription);
    StringAssert.Contains("Required parameter missing: name", ex.Message);
}

直接调用服务的等效测试通过。

[Test]
public void TestPortfolioBlankName()
{
    PortfolioService service = TestHelpers.MockServer<PortfolioService>();
    GetPortfolio request = "{\"name\":\"\"}".FromJson<GetPortfolio>();
    HttpError ex = 
            (HttpError)Assert.Throws(typeof(HttpError), 
            delegate { service.get(request); });

    Assert.AreEqual(400, ex.Status);
    Assert.AreEqual(HttpStatusCode.BadRequest, ex.StatusCode);
    StringAssert.Contains("Required parameter missing: name", ex.Message);
}

DTO:

[Route("/portfolio/{name}", "GET")]
public class GetPortfolio : IReturn<GetPortfolioResponse>
{
    public String name { get; set; }
}

正如 Doug 指出的那样,这就解释了这一点。它无法创建没有名称值的有效路由。太糟糕了,当它无法创建有效路线时,它不会引发异常。返回null并不表明问题的根源。

4

1 回答 1

2

我认为您的问题不在于序列化。

设置JsConfig.IncludeNullValues = true不会影响您的请求 DTO 是否正确地从客户端传输到服务器。它会影响有线协议的效率。该配置仅影响序列化 JSON 的有效负载大小。

而不是发送{"name":null}(13 个 UTF-8 字节),序列化JsConfig.IncludeNullValues = false将发送{}(2 个 UTF-8 字节)。

但是在这两种情况下,服务器接收到的反序列化 DTO 将与客户端上的 DTO 相同。

(此外,您的示例代码正在发送一个空字符串""not null。因此它将完全不受JsConfig.IncludeNullValues设置的影响。)

我猜你的问题在于你的请求 DTO 的路由。它可能有一些模棱两可的地方(或者它与其他请求 DTO 冲突),因此 ServiceStack 无法弄清楚如何将它路由到您的PortfolioService类。

直接调用服务绕过了所有的 ServiceStack 路由逻辑。

您能否包含您的GetPortfolio请求 DTO 类的来源,以便我们查看是否有任何明显错误?

于 2014-05-08T16:47:53.807 回答