如何获取原点返回对象


Get["/"] = _ =>"some data";
Post["/"] = _ =>new {detail="detail.."};

我需要将响应转换为此格式

{
   state: state code
   data: origin data
}

所以,我添加一个后钩

After.AddItemToEndOfPipeline(ResponseFormatHook);
...
private void ResponseFormatHook(NancyContext ctx)
{
    var apiResponse = new APIResponse();
    apiResponse.State = ctx.Response.StatusCode;
    using(var stream = new MemoryStream())
    {
        ctx.Response.Contents.Invoke(stream);
        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
            // get the origin data
            var content = reader.ReadToEnd();
            apiResponse.Data = content;
        }
    }
    var response = new JsonResponse(apiResponse, new DefaultJsonSerializer());
    response.StatusCode = HttpStatusCode.OK;
    ctx.Response = response;
}

对于Get["/"]来说,没关系。 会返回{state:200,data:"some data"}

但对于Post["/"]来说,会返回{state:200,data:"{detail:"detail.."}"}。数据转换为字符串而不是对象。客户端不能一次反序列化。

那么,如何获取原始数据呢?

apiResponse.Data=OriginData,这样就可以了。

编辑 1

也许我可以像这样反序列化数据

apiResponse.Data=JsonConvert.Deserialize(apiResponse.Data) .

但我认为这成本太高了,不是吗?

使用IResponseProcessor将触摸原始数据。

public class APIResponseProcessor : IResponseProcessor
{
    private static readonly IEnumerable<Tuple<string, MediaRange>> extensionMappings =
        new[] {new Tuple<string, MediaRange>("json", MediaRange.FromString("application/json"))};
    public ProcessorMatch CanProcess(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        var match = new ProcessorMatch();
        match.ModelResult = MatchResult.DontCare;
        match.RequestedContentTypeResult = MatchResult.ExactMatch;
        return match;
    }
    public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        var apiResponse = new APIResponse();
        apiResponse.Data = model;
        return new JsonResponse(apiResponse,new DefaultJsonSerializer());
    }
    public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings { get { return extensionMappings; } }
}

使用处理器而不是后挂钩。

最新更新