2014-12-01 2 views
11

ASP.Net WebAPI 위에 SPA를 만들고 있습니다. 히스토리 라우팅에 #/이 아닌 HTML5 기록을 사용하려고하지만 깊은 연결에 문제가있는 경우 //foo/bar이 모두 동일한 HTML 파일을 반환해야합니다 (내 JS가 SPA의 오른쪽 부분을 렌더링 함) .OWIN은 여러 경로에 대해 정적 파일을 전송합니다.

OWIN/Katana가 여러 HTML에 대해 동일한 HTML 파일을 반환하도록하려면 어떻게해야합니까?

+0

정적 파일 미들웨어를 사용하여 index.html을 제공하기 위해 서버에 연결된 URL을 원하십니까? – khellang

+0

그래, 모든 경로 (또는'/ app/*'와 일치하는 경로)는'index.html' 파일을 반환합니다. –

답변

21

은 여전히 ​​StaticFiles 미들웨어 등에서 모든 캐싱의 장점을 유지하면서, 일을 간단하게하기 위해, 난 그냥이

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Map("/app", spa => 
     { 
      spa.Use((context, next) => 
      { 
       context.Request.Path = new PathString("/index.html"); 

       return next(); 
      }); 

      spa.UseStaticFiles(); 
     }); 

     app.UseWelcomePage(); 
    } 
} 

이는 환영 될 것 같은, 인라인 미들웨어를 사용하여 요청 경로를 재 작성할 것 아무것도 아닌 페이지는 /app/*이지만 index.html 대신 항상 제공됩니다.

0

Angular js를 사용하여 비슷한 문제가 발생했으며 약간 다른 방법으로 문제를 해결했습니다.

우리는 Owin을 사용하여 SPA (index.html)의 진입 점에 대한 경로를 매핑했습니다. 이렇게하면 SPA에 액세스하고 다른 페이지로 이동할 수 있습니다. 그러나 페이지를 새로 고친다면 404가됩니다. 기본적으로 AngularJS의 라우팅과 Owin/Katana의 라우팅은 각기 다른 발가락을 밟고있었습니다.

사용자 지정 DelegatingHandler를 만들어서이 문제를 해결했습니다. 이 위임 처리기는 Owin/Katana가 요청과 일치하는 경로를 찾을 수 없을 때마다 사용됩니다 (404).

public class CustomDelegatingHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     Task<HttpResponseMessage> response = base.SendAsync(request, cancellationToken); 
     if (response.Result.StatusCode == HttpStatusCode.NotFound) 
     { 
      response.Result.Content = new StringContent(File.ReadAllText(@"index.html")); 
      response.Result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); 
      response.Result.StatusCode = HttpStatusCode.OK; 
     } 
     return response; 
    } 
} 

우리가 요청을 일치하는 페이지를 찾을 수없는 반환 index.html을 위의 코드 조각의 SPA의 진입 점. 이 위임 핸들러를 사용하기 위해

, 당신은 당신의 HttpConfiguration에 다음 줄을 추가해야합니다 (Owin 호스트 시작할 때) : 한마디로

 var httpConfig = new HttpConfiguration(); 
     httpConfig.MessageHandlers.Add(new CustomDelegatingHandler()); 

을, 나는 SPA에 매핑되는 기본 경로를 가지고, 인식 할 수없는 경로는 DelegatingHandler를 통과하여 동일한 SPA를 제공합니다. 우리는 Request.Path를 수정하지 않고 SPA가 요청을 적절한 페이지로 라우트하도록 허용합니다.

+0

이것은 다소 효과가 있지만 대부분의 경우 프로덕션 환경에서 그러한 구현을 사용하는 것이 좋습니다. File.ReadAllText는 인코딩을 자동 감지하여 (문제를 유발할 수 있음) 다른 접근 방식만큼 효율적이지 않습니다. –

+0

입력 해 주셔서 감사합니다. 그래서 당신은 내가 받아 들인 대답과 비슷한 해결책을 사용하거나 선호되는 File.ReadAllText에 대한 대안이 있다고 제안합니까? – Justin

관련 문제