如何配置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
并不表明问题的根源。
答案 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课程的来源,以便我们查看是否有任何明显错误的内容?