在休息服务中我仿效与另一个产品相同,json以Web表单或查询字符串参数进行GET / POST。
我的请求DTO有另一个DTO对象作为json
的属性如果表单参数是POST,我可以添加一个RequestFilter来反序列化表单参数,但是如果GET与查询变量中的json一起使用,服务栈代码将在StringMapTypeDeserializer中抛出“KeyValueDataContractDeserializer:Error转换为类型”异常。
在StringMapTypeDeserializer中,它获取DTO属性的解析函数。有没有向JsvReader.GetParseFn(propertyType)添加内容;处理我的JSON的反序列化?
或者为此查询参数添加解析的其他方法?没有做自定义处理程序。
感谢
答案 0 :(得分:2)
ServiceStack使用JSV Format(也就是没有引号的JSON)来解析QueryStrings。
JSV允许您在QueryString中嵌入深层对象图,如this example url所示:
http://www.servicestack.net/ServiceStack.Examples.Host.Web/ServiceStack/Json/
SyncReply/StoreLogs?Loggers=[{Id:786,Devices:[{Id:5955,Type:Panel,
Channels:[{Name:Temperature,Value:58},{Name:Status,Value:On}]},
{Id:5956,Type:Tank,TimeStamp:1199303309,
Channels:[{Name:Volume,Value:10035},{Name:Status,Value:Full}]}]}]
如果您想更改ServiceStack使用的默认绑定,您可以注册自己的Custom Request Binder。
答案 1 :(得分:0)
我这样做是为apphost.Configure中的所有dto自动设置我自己的自定义通用请求绑定器。迭代通过EndpointHost.Config.ServiceController.AllOperationTypes好吗?
public static void Register(IAppHost appHost)
{
foreach (Type t in EndpointHost.Config.ServiceController.AllOperationTypes)
{
var method = typeof(MyFormatClass).GetMethod("DeserializationRequestBinder");
var genericMethod = method.MakeGenericMethod(t);
var genericDelegate = (Func<IHttpRequest, object>) Delegate.CreateDelegate( typeof( Func<IHttpRequest, object> ), genericMethod);
// add DeserializationRequestBinder<t> to serivcestack's RequestBinders
appHost.RequestBinders.Add(t, genericDelegate);
}
}
public static object DeserializationRequestBinder<RequestDTO>(IHttpRequest httpReq)
{
// uses a few of the extension methods from ServiceStack.WebHost.Endpoints.Extensions.HttpRequestExtensions
var requestParams = httpReq.GetRequestParams();
// create <RequestDTO> and deserialize into it
}