1

他の製品と同じようにエミュレートしているRESTサービスでは、jsonはWebフォームまたはクエリ文字列パラメーターでGET/POSTされます。

私のリクエストDTOには、jsonのプロパティとして別のDTOオブジェクトがあります

POSTされている場合はRequestFilterを追加してフォームパラメーターを逆シリアル化できますが、クエリ変数でGETをjsonとともに使用すると、サービススタックコードはStringMapTypeDeserializerで「KeyValueDataContractDeserializer:タイプへの変換エラー」例外をスローします。

StringMapTypeDeserializerでは、DTOのプロパティの解析関数を取得します。JsvReader.GetParseFn(propertyType);に何かを追加する方法はありますか?JSONの逆シリアル化を処理するには?

または、このクエリパラメータの解析を追加する他の方法はありますか?カスタムハンドラーを実行せずに。

ありがとう

4

2 に答える 2

2

ServiceStackは、JSV形式(引用符なしのJSON)を使用してQueryStringを解析します。

JSVを使用すると、次の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が使用するデフォルトのバインディングを変更する場合は、独自のカスタムリクエストバインダーを登録できます。

于 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 に答える