2014-10-05 3 views
0

반환되는 오류 유형에 따라 특정 오류 페이지 (404, 500 등)를 제공하도록 ServiceStack을 구성하는 방법은 무엇입니까?servicestack의 사용자 정의 오류 페이지

현재 HTML 파일 요청이 인증되었는지 확인하기 위해 아래의 RawHttpHandler 코드를 사용하고 있습니다. 그러나 사용자가 존재하지 않는 파일이나 엔드 포인트를 지정하면 어떻게하면 404.html 페이지를 반환 할 수 있습니까?

public override void Configure(Container container) 
{ 
    this.CustomHttpHandlers[HttpStatusCode.NotFound] = 
     new RazorHandler("/404"); 
} 

CustomHttpHandlers 모두 ASP.NET을 지원 단지 HttpHandler를 어떤 IServiceStackHandler 될 수 있습니다

this.RawHttpHandlers.Add(httpReq => 
      { 
       var session = httpReq.GetSession(); 

       if(!session.IsAuthenticated) { 
        var isHtmlFileRequest = httpReq.PathInfo.EndsWith(".html"); 

        if(isHtmlFileRequest && !files.Any(s => httpReq.PathInfo.ToLower().Contains(s))) { 
         return new RedirectHttpHandler { 
          AbsoluteUrl = "/Login.html" 
         }; 
        } 
       } 

       return null; 
      }); 

답변

2

Error Handling wiki는 ServiceStack에서 Customize Handling of Exceptions에 여러 가지 방법을 보여줍니다, 예를 들어, 당신은 함께 /404.cshtml에 404 오류를 리디렉션 할 수 있습니다 및 HttpListener 요청. 하나를 만드는 가장 쉬운 방법은 IServiceStackHandler에서 상속하는 것입니다.

public class CustomStaticFileHandler : HttpAsyncTaskHandler 
{ 
    string filePath; 
    public CustomStaticFileHandler(string filePath) 
    { 
     this.filePath = filePath; 
    } 

    public override void ProcessRequest(HttpContextBase context) 
    { 
     var httpReq = context.ToRequest(GetType().GetOperationName()); 
     ProcessRequest(httpReq, httpReq.Response, httpReq.OperationName); 
    } 

    public override void ProcessRequest(IRequest request, IResponse response, 
     string operationName) 
    { 
     response.EndHttpHandlerRequest(skipClose: true, afterHeaders: r => 
     { 
      var file = HostContext.VirtualPathProvider.GetFile(filePath); 
      if (file == null) 
       throw new HttpException(404, "Not Found"); 

      r.SetContentLength(file.Length); 
      var outputStream = r.OutputStream; 
      using (var fs = file.OpenRead()) 
      { 
       fs.CopyTo(outputStream, BufferSize); 
       outputStream.Flush(); 
      }    
     } 
    } 
} 

이 후 정상적으로 등록 할 수 있습니다, 예 : 그것은 단지 HTTP 요청 경로를 사용하는 대신 지정된 filePath를 기록 제외하고 여기에 StaticFileHandler 유사한 사용자 정의 정적 파일 처리기의 예

public override void Configure(Container container) 
{ 
    this.CustomHttpHandlers[HttpStatusCode.NotFound] = 
     new CustomStaticFileHandler("/404.html"); 
} 
+0

감사. 나는 전에 그것을 보았지만, 면도기없이 어떻게 작동시키는지를 확신하지 못했습니다. Razor 패키지를 설치해야합니까? 나는 그것을 지금 사용하지 않고있다. – theoutlander

+0

즉, 파일 핸들러 또는 html 파일을 제공하는 데 사용할 수있는 것이 있습니까? – theoutlander

+0

@theoutlander 예 RazorHandler는'ServiceStack.Razor' NuGet 패키지가 필요했습니다. 정적 파일을 제공하는 방법을 보여주는 예제를 사용하여 답변을 업데이트했습니다. – mythz

관련 문제