1

「Prevent Image Leeching」に関するデモを作成しようとしています。参照リソース: http://www.mikesdotnetting.com/article/126/asp-net-mvc-prevent-image-leeching-with-a-custom-routehandler

しかし、私が使用する<img src="~/graphics/a.png" />と、ImageRouteHandler.csは機能しません。残念ながら、この ImageRouteHandler.cs はまだ機能しません。どうして ??

public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new ImageHandler(requestContext);
    }
}

public class ImageHandler : IHttpHandler
{
    public ImageHandler(RequestContext context)
    {
        ProcessRequest(context);
    }

    private static void ProcessRequest(RequestContext requestContext)
    {
        var response = requestContext.HttpContext.Response;
        var request = requestContext.HttpContext.Request;
        var server = requestContext.HttpContext.Server;
        var validRequestFile = requestContext.RouteData.Values["filename"].ToString();
        const string invalidRequestFile = "thief.png";
        var path = server.MapPath("~/graphics/");

        response.Clear();
        response.ContentType = GetContentType(request.Url.ToString());

        if (request.ServerVariables["HTTP_REFERER"] != null &&
            request.ServerVariables["HTTP_REFERER"].Contains("http://localhost:8010/")) //mikesdotnetting.com
        {
            response.TransmitFile(path + validRequestFile);
        }
        else
        {
            response.TransmitFile(path + invalidRequestFile);
        }
        response.End();
    }

    private static string GetContentType(string url)
    {
        switch (Path.GetExtension(url))
        {
            case ".gif":
                return "Image/gif";
            case ".jpg":
                return "Image/jpeg";
            case ".png":
                return "Image/png";
            default:
                break;
        }
        return null;
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

    public void ProcessRequest(HttpContext context)
    {
        throw new NotImplementedException();
    }
}
4

1 に答える 1

0

~URL の意味のあるプレフィックスではありません。などの一部の ASP.NET コンテキストではServer.MapPath、アプリケーション ルートを参照するために使用されることがありますが、HTML では次の URL を使用します。

<img src="~/graphics/a.png" />

...有効じゃない。

先頭で使用/してサイトのルートを参照するか、先頭/を省略して相対 URL を参照します。これがあなたが直面している唯一の問題かどうかは明らかではありませんが、それは1 つの問題です。これを行うと、運が良くなる場合があります。

<img src="/graphics/a.png" />

ところで、開発者ツールのネットワーク タブに注意してください。これにより、すべてのリクエスト (画像リクエストなど) とレスポンスを確認できます。「うまくいかない」などと言っても役に立ちません。物事が「うまくいかない」ことは決してありません。彼らはあなたが期待していること以外のことをするだけです。より適切な説明は、「404 エラーが発生しています」または「画像のリクエストが行われていません」です。

于 2016-10-13T04:22:30.130 に答える