2014-08-27 6 views
5

Owin과 Katana와 함께 놀고있어 내 공용 폴더에 정적 파일을 제공하고 싶습니다.Owin은 특정 폴더의 파일 만 처리합니다.

저는 스타일 시트와 스크립트 폴더가있는 Content 폴더가 있습니다.

내 시작 :

public void Configuration(IAppBuilder app) 
    { 
#if DEBUG 
     //when things go south 
     app.UseErrorPage(); 
    #endif 

     // Remap '/' to '.\public\'. 
     // Turns on static files and public files. 
     app.UseFileServer(new FileServerOptions() 
     { 
      RequestPath = PathString.Empty, 
      FileSystem = new PhysicalFileSystem(@".\public"), 
     }); 

    } 

그래서 로컬 호스트로 이동하는 경우 경우 : 8861는/내 공용 폴더의 index.html 파일을 이동합니다. 괜찮아. 하지만 차단할 내 localhost : 8861/Content/style.css를 탐색 할 수도 있습니다. 사용자가 필요로하는 모든 것이 공용 폴더에서 액세스 가능해야합니다. 나머지는 모두 막아야합니다.

어떻게하면됩니까?

답변

1

파일 서버 구성이 정확하며 다른 폴더에 대한 액세스를 허용하지 않습니다. 내가 테스트 OWIN 자체 호스트 프로젝트 내에서 그것을 검사하고 예상대로 작동, 공용 폴더 만 액세스 할 수 있습니다. 나는 IIS를 사용하여 OWIN 응용 프로그램을 호스팅한다고 가정합니다 (따라서 응용 프로그램은 자체 호스팅되지 않습니다). 그렇다면 IIS 정적 파일 처리기는 정적 파일 및 디렉터리 (및 콘텐츠 폴더)에 대한 허용을 허용합니다. 따라서 IIS에서 정적 파일에 대한 액세스를 비활성화하는 방법 (web.config에서 수행 할 수 있음) 또는 일부 파일에 대한 액세스를 제한하는 방법을 검색 할 수 있습니다.

웹 사이트 구성에서 StaticFile 처리기를 제거 할 수 있지만이 순간부터 IIS는 정적 파일을 전혀 제공하지 않으므로 신중하게 처리해야합니다.

<configuration> 
    <system.webServer> 
     <handlers> 
      <remove name="StaticFile" /> 
     </handlers> 
    </system.webServer> 
</configuration> 
+0

감사합니다. 실제로이 문제를 해결했습니다. 그러나 내 공용 폴더에서 다른 파일을 제공하는 데 문제가있는 것 같습니다. 공개에는 index.html, style.css 및 script.js가 포함되어 있습니다. 색인이 제공되지만 style.css 및 script.js는 404.4를 제공합니다. 어떤 아이디어? – user1613512

+0

이상하게도 모든 것이 내 PC에서 제대로 작동하지만 자체 호스팅 앱으로 테스트합니다. 당신은 당신의 사이트/public/style.css가 아닌 다음 urls yoursite/style.css를 사용하여이 파일들에 접근 했습니까? 이 파일들은 웹 사이트의 폴더에 있습니다. – ntl

+0

한 가지 더 시도해 볼 수 있습니다. 다음 미들웨어를 마지막으로 등록하십시오 : app.Run (context => {return context.Response.WriteAsync ("Wildcard OWIN App");}); 대리자 내부에 중단 점을 배치하고 브라우저에서 style.css에 액세스하려고 시도합니다. 이 핸들러는 다른 미들웨어에서 처리하지 않은 모든 요청을 처리하는 와일드 카드 미들웨어입니다. 응용 프로그램이 중단 점으로 중지되면 OWIN이 요청을 처리하지만 구성이 올바르지 않습니다. 그렇지 않으면 IIS 구성에 문제가 있습니다. – ntl

2

당신은 마른 사람에게 당신이, 또는 당신은 몇 가지 미들웨어와 완전히 제어 할 수있는 역할을하고 싶지 않은 어떤 파일을 통해 절대 제어 파일 처리가 필요합니다. 개발 도중 캐시되지 않은 파일 서비스를 원했기 때문에이 작업을 수행했습니다.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Threading.Tasks; 
using System.Web; 

namespace Owin 
{ 
    using AppFunc = Func<IDictionary<string, object>, Task>; 

    public static class DynamicFileExtension 
    {  
     /// <summary> 
     /// ONLY use during development 
     /// </summary> 
     public static void UseDynamicFiles(this IAppBuilder app, string baseDirectory) 
     { 
      app.Use(new Func<AppFunc, AppFunc>(next => (async context => 
      { 
       var method = (string) context["owin.RequestMethod"]; 
       var requestpath = (string) context["owin.RequestPath"]; 
       var scheme = (string) context["owin.RequestScheme"]; 
       var response = (Stream) context["owin.ResponseBody"]; 
       var responseHeader = (Dictionary<string, string[]>) context["owin.ResponseHeaders"]; 

       if (method == "GET" && scheme == "http") 
       { 
        var fullpath = baseDirectory + requestpath; 

        // block logic...  

        if (File.Exists(fullpath)) 
        { 

         using (var file = File.OpenRead(fullpath)) 
         { 
          await file.CopyToAsync(response); 
         } 

         var mime = MimeMapping.GetMimeMapping(fullpath); 

         responseHeader.Add("Content-Type", new[] {mime}); 

         return; 
        } 
       } 

       await next.Invoke(context); 
      }))); 
     } 
    } 
} 

저는 프로덕션에서는 사용하지 않지만 저에게는 트릭입니다.