ASP.NET 라우팅을 사용하여 정적 파일 제공
정적 파일을 제공하는 데 MVC가 아닌 ASP.Net 라우팅을 사용할 수 있습니까?
경로 지정을 원한다고 말합니다.
http://domain.tld/static/picture.jpg
로.
http://domain.tld/a/b/c/picture.jpg
다시 작성된 URL이 즉시 계산된다는 의미에서 동적으로 수행하고 싶습니다.나는 정적 경로를 완전히 설정할 수 없습니다.
어쨌든 다음과 같은 경로를 만들 수 있습니다.
routes.Add(
"StaticRoute", new Route("static/{file}", new FileRouteHandler())
);
FileRouteHandler.ProcessRequest
나는 경를다쓸수방에서 쓸 수 ./static/picture.jpg
/a/b/c/picture.jpg
정적 핸들러를 은 "" "" "" . " " " ASP"를 합니다.NET »StaticFileHandler
이 내부 입니다.안타깝게도 이 수업은 내부 수업입니다.반사를 사용하여 핸들러를 만들려고 시도했지만 실제로 작동합니다.
Assembly assembly = Assembly.GetAssembly(typeof(IHttpHandler));
Type staticFileHandlerType = assembly.GetType("System.Web.StaticFileHandler");
ConstructorInfo constructorInfo = staticFileHandlerType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
return (IHttpHandler) constructorInfo.Invoke(null);
하지만 내부 유형을 사용하는 것은 적절한 해결책이 아닌 것 같습니다.은▁my다것▁another▁own▁is▁to니▁implement입▁option다StaticFileHandler
그러나 범위 및 태그와 같은 HTTP 항목을 올바르게 지원하는 것은 쉽지 않습니다.
ASP.NET에서 정적 파일 라우팅에 어떻게 접근해야 합니까?
왜 IIS를 사용하지 않습니까?응용프로그램에 도달하기도 전에 첫 번째 경로에서 두 번째 경로로 요청을 지정하는 리디렉션 규칙을 만들 수 있습니다.따라서 요청을 리디렉션하는 데 더 빠른 방법이 될 수 있습니다.
IIS7+가 있다고 가정하면 다음과 같은 작업을 수행할 수 있습니다.
<rule name="Redirect Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
</rule>
또는 @ni5ni6에서 제안한 대로 리디렉션할 필요가 없는 경우:
<rule name="Rewrite Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Rewrite" url="/a/b/c/{R:1}" />
</rule>
@RyanDawkins에 대한 2015-06-17 편집:
그리고 다시 쓰기 규칙이 어디로 가는지 궁금하다면, 여기 위치 지도가 있습니다.web.config
java.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<!-- rules go below -->
<rule name="Redirect Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
몇 시간 동안 이 문제를 조사한 결과 무시 규칙을 추가하는 것만으로도 정적 파일이 처리된다는 것을 알게 되었습니다.
RegisterRoutes(RouteCollection 경로)에서 다음 무시 규칙을 추가합니다.
routes.IgnoreRoute("{file}.js");
routes.IgnoreRoute("{file}.html");
저도 비슷한 문제가 있었어요.결국 HttpContext를 사용하게 되었습니다.경로 다시 쓰기:
public class MyApplication : HttpApplication
{
private readonly Regex r = new Regex("^/static/(.*)$", RegexOptions.IgnoreCase);
public override void Init()
{
BeginRequest += OnBeginRequest;
}
protected void OnBeginRequest(object sender, EventArgs e)
{
var match = r.Match(Request.Url.AbsolutePath);
if (match.Success)
{
var fileName = match.Groups[1].Value;
Context.RewritePath(string.Format("/a/b/c/{0}", fileName));
}
}
}
저는 내부 장치를 사용하는 것에 대한 대안을 생각해냈습니다.StaticFileHandler
에서.에서IRouteHandler
부를게요HttpServerUtility.Transfer
:
public class FileRouteHandler : IRouteHandler {
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
String fileName = (String) requestContext.RouteData.Values["file"];
// Contrived example of mapping.
String routedPath = String.Format("/a/b/c/{0}", fileName);
HttpContext.Current.Server.Transfer(routedPath);
return null; // Never reached.
}
}
이건 해킹입니다. 그IRouteHandler
돌려주기로 되어 있습니다.IHttpHandler
중단하지 않고 현재 요청을 전송합니다.하지만, 그것은 실제로 제가 원하는 것을 성취합니다.
부용사 StaticFileHandler
그것에 접근하기 위해서는 반성이 필요하기 때문에 또한 다소 해킹이지만, 적어도 MSDN에 대한 문서가 있어 약간 더 "공식적인" 클래스가 됩니다.안타깝게도 부분적인 신뢰 환경에서 내부 수업을 반영하는 것은 불가능하다고 생각합니다.
계속 사용할 것입니다.StaticFileHandler
가까운 미래에 ASP.NET에서 제거되지 않을 것으로 생각하기 때문입니다.
정적 파일을 처리하려면 TransferRequestHandler를 추가해야 합니다.다음 답변을 참조하십시오. https://stackoverflow.com/a/21724783/22858
언급URL : https://stackoverflow.com/questions/1149750/using-asp-net-routing-to-serve-static-files
'programing' 카테고리의 다른 글
mongoose를 이용하여 mongoDB Atlas에 연결하는 방법 (0) | 2023.07.18 |
---|---|
스프링 부트 응용 프로그램:유형의 반환 값에 대한 변환기를 찾을 수 없습니다. (0) | 2023.07.18 |
#define 매크로에서 # 기호를 이스케이프하시겠습니까? (0) | 2023.07.18 |
각도 형식(반응성이 아님)의 데이터가 변경되었는지 감지 (0) | 2023.07.18 |
PDB 중단점을 파이썬 코드에 넣는 더 간단한 방법은 무엇입니까? (0) | 2023.07.18 |