上篇博客,当没有权限的用户访问一些资源时,返回的是403错误,403对于用户来说是一个莫名其妙的数字,我们当然要处理成友好的提示。

关于错误处理,翻看了一下Nancy的源码,是这样处理的,见下面地址:

https://github.com/NancyFx/Nancy/blob/master/src/Nancy/ErrorHandling/DefaultStatusCodeHandler.cs

其实Nancy是允许我们采用相同的办法处理,现在把DefaultStatusCodeHandler.cs的源码复制下来,改成我们自己的CustomStatusCode.cs如下,关于详细说明,参考Nancy源码DefaultStatusCodeHandler.cs。

usingNancy;usingNancy.ErrorHandling;usingNancy.ViewEngines;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Text;usingNancy.Responses.Negotiation;usingNancy.Extensions;usingNancy.IO;namespaceNancySelfHostWeb{publicclassCustomStatusCode:IStatusCodeHandler{privateconststringDisableErrorTracesTrueMessage="Errordetailsarecurrentlydisabled.Pleaseset<code>StaticConfiguration.DisableErrorTraces=false;</code>toenable.";privatereadonlyIDictionary<HttpStatusCode,string>errorMessages;privatereadonlyIDictionary<HttpStatusCode,string>errorPages;privatereadonlyIResponseNegotiatorresponseNegotiator;privatereadonlyHttpStatusCode[]supportedStatusCodes={HttpStatusCode.Forbidden,HttpStatusCode.NotFound};publicCustomStatusCode(IResponseNegotiatorresponseNegotiator){this.errorMessages=newDictionary<HttpStatusCode,string>{{HttpStatusCode.Forbidden,"查看是否有授权!"},{HttpStatusCode.NotFound,"找不到你要的资源!"}};this.errorPages=newDictionary<HttpStatusCode,string>{{HttpStatusCode.Forbidden,LoadResource("NancySelfHostWeb.403.html")},{HttpStatusCode.NotFound,LoadResource("NancySelfHostWeb.404.html")}};this.responseNegotiator=responseNegotiator;}publicboolHandlesStatusCode(HttpStatusCodestatusCode,NancyContextcontext){returnthis.supportedStatusCodes.Any(s=>s==statusCode);}publicvoidHandle(HttpStatusCodestatusCode,NancyContextcontext){if(context.Response!=null&&context.Response.Contents!=null&&!ReferenceEquals(context.Response.Contents,Response.NoBody)){return;}if(!this.errorMessages.ContainsKey(statusCode)||!this.errorPages.ContainsKey(statusCode)){return;}ResponseexistingResponse=null;if(context.Response!=null){existingResponse=context.Response;}context.NegotiationContext=newNegotiationContext();varresult=newDefaultStatusCodeHandlerResult(statusCode,this.errorMessages[statusCode],StaticConfiguration.DisableErrorTraces?DisableErrorTracesTrueMessage:context.GetExceptionDetails());try{context.Response=this.responseNegotiator.NegotiateResponse(result,context);context.Response.StatusCode=statusCode;if(existingResponse!=null){context.Response.ReasonPhrase=existingResponse.ReasonPhrase;}return;}catch(ViewNotFoundException){}this.ModifyResponse(statusCode,context,result);}privatevoidModifyResponse(HttpStatusCodestatusCode,NancyContextcontext,DefaultStatusCodeHandlerResultresult){if(context.Response==null){context.Response=newResponse{StatusCode=statusCode};}varcontents=this.errorPages[statusCode];if(!string.IsNullOrEmpty(contents)){contents=contents.Replace("[DETAILS]",result.Details);}context.Response.ContentType="text/html";context.Response.Contents=s=>{using(varwriter=newStreamWriter(newUnclosableStreamWrapper(s),Encoding.UTF8)){writer.Write(contents);}};}privatestaticstringLoadResource(stringfilename){//获取当前资源文件varresourceStream=typeof(CustomStatusCode).Assembly.GetManifestResourceStream(string.Format("{0}",filename));if(resourceStream==null){returnstring.Empty;}using(varreader=newStreamReader(resourceStream)){returnreader.ReadToEnd();}}internalclassDefaultStatusCodeHandlerResult{publicDefaultStatusCodeHandlerResult(HttpStatusCodestatusCode,stringmessage,stringdetails){this.StatusCode=statusCode;this.Message=message;this.Details=details;}publicHttpStatusCodeStatusCode{get;privateset;}publicstringMessage{get;privateset;}publicstringDetails{get;privateset;}}}}


这样还可以把Nancy内置的500,404错误改成我们自定义的显示。

有时觉得这样太麻烦,可以自大在Module中去判断登录用户是否具有角色,代码如下

usingNancy;usingNancy.Security;usingSystem.Linq;namespaceTestSelfHostWeb.Modules{publicclassIndexModule:NancyModule{publicIndexModule(){//开启全局验证this.RequiresAuthentication();Get["/"]=parameters=>{//开启角色验证,只有该角色可以访问本路由//this.RequiresClaims("admin");//自己判断登录角色具有权限if(!this.Context.CurrentUser.Claims.Contains("admin")){returnView["error"];//定义一个错误页面error.cshtml即可}returnView["index"];};}}}


附件:http://down.51cto.com/data/2367711