南希:在AfterRequest事件中修改模型?

时间:2013-09-30 13:20:31

标签: c# nancy

我想在我的AfterRequest中添加一个Bootstrapper.cs事件处理程序,它可以在调用每个路由后修改Response上的模型。这可能吗?我没有在响应中看到任何可以访问模型的属性(如果有的话)。

以下是我的示例用法(来自Bootstrapper.cs):

 protected override void ApplicationStartup(..., IPipelines pipelines)
 {
    ...
    pipelines.AfterRequest += ModifyModel;
 }

 private void ModifyModel(NancyContext ctx)
 {
    // do things to the response model here
 }

3 个答案:

答案 0 :(得分:3)

如果您仍然需要此功能,您可能会对我刚刚在Nuget上发布的扩展感兴趣:https://www.nuget.org/packages/Nancy.ModelPostprocess.Fody。我们的项目需要类似的功能

这将允许您在路线执行后修改模型。请查看Bitbucket page

上的说明

请告诉我这是否符合您的需求。

答案 1 :(得分:1)

我认为不是那么简单,你应该检查ctx.Response.Content以便知道使用了哪个反序列化器以及你返回的是什么对象,我做了一个简单的例子,返回一个序列化为Json的Foo对象....

    public class MyBootstrapper : Nancy.DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(TinyIoC.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);

            pipelines.AfterRequest += ModifyModel;
        }

        private void ModifyModel(NancyContext ctx)
        {
            Foo foo;
            using(var memory = new MemoryStream())
            {
                ctx.Response.Contents.Invoke(memory);

                var str = Encoding.UTF8.GetString(memory.ToArray());
                foo = JsonConvert.DeserializeObject<Foo>(str);
            }

            ctx.Response.Contents = stream =>
            {
                using (var writer = new StreamWriter(stream))
                {
                    foo.Code = 999;
                    writer.Write(JsonConvert.SerializeObject(foo));
                }
            };
        }
    }

    public class HomeModule : Nancy.NancyModule
    {
        public HomeModule()
        {

            Get["/"] = parameters => {
                return Response.AsJson<Foo>(new Foo { Bar = "Bar" });
            };
        }
    }

    public class Foo
    {
        public string Bar { get; set; }
        public int Code { get; set; }
    }

答案 2 :(得分:0)

在对此进行更多研究之后,这与现在存在的Nancy框架完全不可能(至少在合理范围内)。