1

在其余服务中,我正在模拟与另一个产品相同的内容,json 以 Web 表单或查询字符串参数的形式获取/发布。

我的请求 DTO 有另一个 DTO 对象作为 json 的属性

如果表单参数是 POST 的,我可以添加一个 RequestFilter 来反序列化表单参数,但如果 GET 在查询变量中与 json 一起使用,则服务堆栈代码将在 StringMapTypeDeserializer 中抛出“KeyValueDataContractDeserializer:转换为类型时出错”异常。

在 StringMapTypeDeserializer 中,它获取 DTO 属性的解析函数。有没有向 JsvReader.GetParseFn(propertyType); 中添加一些东西?处理我的 JSON 的反序列化?

或者为这个查询参数添加解析的其他方式?不做自定义处理程序。

谢谢

4

2 回答 2

2

ServiceStack 使用JSV 格式(即不带引号的 JSON)来解析 QueryStrings。

JSV 允许您在 QueryString 中嵌入深层对象图,如以下示例 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

于 2012-11-07T19:46:14.060 回答
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

    }
于 2012-11-09T07:04:57.573 回答