【问题标题】:Servicestack accessing json服务栈访问 json
【发布时间】:2013-08-02 07:07:26
【问题描述】:

我的 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 数据?

【问题讨论】:

  • 如果我理解正确,您想在 ServiceStack 尝试将其反序列化为请求 DTO 对象之前访问原始请求正文数据?
  • 是的。如果我使用内容类型 application/x-www-form-urlencoded 发布,我可以在过滤器属性代码中调试时看到数据,如果我使用 GET 而不是 POST,我会在查询字符串参数中看到它。

标签: servicestack


【解决方案1】:

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

JsConfig<MyRequestDtoClass>.DeSerializeFn = DeserializeMyRequestDto;

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

MyRequestDtoClass DeserializeMyRequestDto(string rawBody) { ... }

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

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2015-07-09
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多