使用空(非空)请求对象生成JsonServiceClient进程请求

时间:2014-05-08 00:33:00

标签: servicestack servicestack-text servicestack-bsd

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

我希望得到一个例外,但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; }
}

道格指出,这解释了它。它没有创建没有name值的有效路由。太糟糕了,它无法在无法创建有效路由时引发异常。返回null并不表明问题的根源。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

我猜你的问题在于你的请求DTO的路由。可能有些含糊不清(或者它与其他请求DTO冲突),这样ServiceStack无法弄清楚如何将它路由到PortfolioService类。

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

您是否可以包含GetPortfolio请求DTO课程的来源,以便我们查看是否有任何明显错误的内容?