ASP.Net WebAPI 위에 SPA를 만들고 있습니다. 히스토리 라우팅에 #/
이 아닌 HTML5 기록을 사용하려고하지만 깊은 연결에 문제가있는 경우 /
과 /foo/bar
이 모두 동일한 HTML 파일을 반환해야합니다 (내 JS가 SPA의 오른쪽 부분을 렌더링 함) .OWIN은 여러 경로에 대해 정적 파일을 전송합니다.
OWIN/Katana가 여러 HTML에 대해 동일한 HTML 파일을 반환하도록하려면 어떻게해야합니까?
ASP.Net WebAPI 위에 SPA를 만들고 있습니다. 히스토리 라우팅에 #/
이 아닌 HTML5 기록을 사용하려고하지만 깊은 연결에 문제가있는 경우 /
과 /foo/bar
이 모두 동일한 HTML 파일을 반환해야합니다 (내 JS가 SPA의 오른쪽 부분을 렌더링 함) .OWIN은 여러 경로에 대해 정적 파일을 전송합니다.
OWIN/Katana가 여러 HTML에 대해 동일한 HTML 파일을 반환하도록하려면 어떻게해야합니까?
은 여전히 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 대신 항상 제공됩니다.
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가 요청을 적절한 페이지로 라우트하도록 허용합니다.
이것은 다소 효과가 있지만 대부분의 경우 프로덕션 환경에서 그러한 구현을 사용하는 것이 좋습니다. File.ReadAllText는 인코딩을 자동 감지하여 (문제를 유발할 수 있음) 다른 접근 방식만큼 효율적이지 않습니다. –
입력 해 주셔서 감사합니다. 그래서 당신은 내가 받아 들인 대답과 비슷한 해결책을 사용하거나 선호되는 File.ReadAllText에 대한 대안이 있다고 제안합니까? – Justin
정적 파일 미들웨어를 사용하여 index.html을 제공하기 위해 서버에 연결된 URL을 원하십니까? – khellang
그래, 모든 경로 (또는'/ app/*'와 일치하는 경로)는'index.html' 파일을 반환합니다. –