我一直在使用一种技术来保护我在ServiceStack中的普通cshtml文件(不受服务支持)。我将概述下面使用的技术。但是,最近在ServiceStack中添加了Razor 2支持已经破坏了我的实现。
原始实施
using ServiceStack.Razor;
using ServiceStack.ServiceInterface;
public class SecuredViewPage : ViewPage
{
public override void Init(ServiceStack.Razor.Templating.IRazorViewEngine viewEngine, ServiceStack.Html.ViewDataDictionary viewData, ServiceStack.ServiceHost.IHttpRequest httpReq, ServiceStack.ServiceHost.IHttpResponse httpRes)
{
new AuthenticateAttribute().Execute(httpReq, httpRes, this);
base.Init(viewEngine, viewData, httpReq, httpRes);
}
}
然后在我的cshtml文件中,我有以下内容:
@inherits SecuredViewPage
现在的问题是,在3.9.94中,Init方法不再是 ViewPageBase 中的抽象方法。
My Questions
有没有更好的方法来实现这一目标?
或
我应该看看ServiceStack是否会改变实施?
答案 0 :(得分:3)
我已经找到了解决问题的方法。我不确定这是多么好的解决方案,但它似乎对我有用。
我基本上从Servicestack源复制了ViewPage.cs,并将我的身份验证检查放在那里。
public class SecuredViewPage : ViewPageBase<dynamic>, IRazorView
{
public HtmlHelper Html = new HtmlHelper();
public override Type ModelType
{
get
{
return typeof(DynamicRequestObject);
}
}
public void Init(IViewEngine viewEngine, IHttpRequest httpReq, IHttpResponse httpRes)
{
base.Request = httpReq;
base.Response = httpRes;
new AuthenticateAttribute().Execute(Request, Response, this);
Html.Init(viewEngine: viewEngine, httpReq: httpReq, httpRes: httpRes, razorPage: this);
}
public override void SetModel(object o)
{
base.SetModel(o);
Html.SetModel(o);
}
public void WriteTo(StreamWriter writer)
{
this.Output = Html.Writer = writer;
this.Execute();
this.Output.Flush();
}
public override void Execute()
{
}
}