我想在我的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
}
答案 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框架完全不可能(至少在合理范围内)。