在其余的服务我正在模仿另一个相同的产品,JSON是GET / POST方法在网页表单或查询字符串参数。
我的要求DTO还有一个DTO对象作为JSON属性
我可以添加RequestFilter如果它发布到解串行化的形式参数,但如果GET在查询变量使用JSON服务栈代码将抛出“KeyValueDataContractDeserializer:错误转换为类型”中StringMapTypeDeserializer异常。
在StringMapTypeDeserializer它得到了DTO的特性解析功能。 是添加的东西JsvReader.GetParseFn(属性类型)的有反正; 处理我的JSON的反序列化?
或添加解析此查询参数的一些其他的方式? 没有做一个自定义的处理程序。
谢谢
ServiceStack使用JSV格式 (又名JSON不带引号)来解析查询字符串。
JSV让你嵌入查询字符串深对象图所看到这个例子网址 :
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使用,你可以注册自己的自定义请求活页夹 。
我做这个自动设置自己的自定义通用请求粘结剂所有DTO的在apphost.Configure。 通过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
}