1

我的 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 的根属性(例如:DTO 中的 userId:'foo' -> UserId=foo),则正确反序列化 Json 数据。

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

4

1 回答 1

3

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

JsConfig<MyRequestDtoClass>.DeSerializeFn = DeserializeMyRequestDto;

函数或 lambda 在哪里DeserializeMyRequestDto采用单个字符串参数 - 原始请求正文 - 并返回 DTO 的反序列化实例:

MyRequestDtoClass DeserializeMyRequestDto(string rawBody) { ... }

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

于 2013-08-01T23:07:26.863 回答