programing

ASP.NET 라우팅을 사용하여 정적 파일 제공

stoneblock 2023. 7. 18. 21:28

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.configjava.

<?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