我的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数据?
答案 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
重置为最初的位置。)