Servicestack访问json

时间:2013-07-29 09:01:11

标签: servicestack

我的Servicestack服务正在发布Json(由jquery发布)。

sendData = function(dataToSend) {
  var request;
  return request = $.ajax({
    url: "/api/test",
    type: "post",
    data: JSON.stringify(dataToSend),
    dataType: "json",
    accept: "application/json",
    contentType: "application/json"
  });

如果Json数据对应于我的DTO的根属性(例如:userId:'foo' - > DID中的UserId = foo),则会正确反序列化。

我希望在反序列化之前访问原始json发布数据以添加自定义反序列化。 到目前为止,我使用自定义过滤器(RequestFilterAttribute)访问查询字符串时没有问题,或者如果数据形式发布了数据。 现在,我看到使用Chrome开发者工具发布的数据位于带有“请求有效负载”的标题中,因此在调试IHttpRequest时我也无法访问FormData和QueryString。 如何在过滤器中获取原始json数据?

1 个答案:

答案 0 :(得分:3)

如果要使用特定请求DTO的自定义行为替换默认反序列化行为,可以在AppHost设置代码中执行此操作:

JsConfig<MyRequestDtoClass>.DeSerializeFn = DeserializeMyRequestDto;

其中DeserializeMyRequestDto是一个函数或lambda采用单个字符串参数 - 原始请求体 - 并返回DTO的反序列化实例:

MyRequestDtoClass DeserializeMyRequestDto(string rawBody) { ... }

RequestFilterAttribute子类可以使用request.GetRawBody()访问原始请求正文,其中request是传递给过滤器IHttpRequest方法的Execute对象。但根据我的经验,GetRawBody返回一个空字符串,因为由于反序列化,请求输入流似乎被消耗了。我通过创建一个HTTP模块(通过DynamicModuleUtility.RegisterModule在AppHost中注册)来解决这个问题,该模块将“窥视”BeginRequest事件处理程序中的请求输入流。 (“peek”函数将读取请求输入流,然后将流的Position重置为最初的位置。)