Модифицируйте RewriteContext Host в NetCore 2, переписывая промежуточное ПО - PullRequest
0 голосов
/ 10 января 2019

Мне нужно переписать, а не перенаправлять определенные запросы к файлам GET во внешнее хранилище (размещенное в другом домене)

Я могу добиться этого с помощью перенаправления с использованием промежуточного программного обеспечения для перезаписи, однако вместо этого я хотел бы переписать.

Мне нужно использовать некоторую логику для перезаписи в определенное местоположение файла, поэтому я следовал учебнику https://docs.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?view=aspnetcore-2.0&tabs=aspnetcore2x#method-based-rule.

Когда я устанавливаю хост и путь, я вижу, что абсолютный URL-адрес выглядит правильно, но при выходе из метода я получаю «Веб-страница не найдена для веб-адреса:», и отображаемый URL является исходным URL-адресом запроса

RewriteRule.cs (также содержит логику перенаправления URL в ApplyRule (), которую я не хочу использовать)

public static void RewriteStorageFileRequests(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var path = request.Path.Value;
        if (path.Contains("foo/bar"))
        {
            context.Result = RuleResult.SkipRemainingRules;
            request.Host = new HostString("storage/space"); 
            request.Path = path.Replace("foo/bar", string.Empty);
            var test2 = request.GetDisplayUrl();
        }
    }  

По сути, если вызов поступает как:

https://localhost:44327/foo/bar/bf34d911-03db-5tda-9c99-c7dd96593159/w3.jpg

Я хочу переписать его на:

https://storage/space/bf34d911-03db-5tda-9c99-c7dd96593159/w3.jpg

Startup.cs

            app.UseRewriter(new RewriteOptions().Add(RewriteUrlRule.RewriteStorageFileRequests));

test2 отображает правильный URL в отладчике.

Я попытался установить для хоста пустую строку и передать значение хоста (хранилище / пространство) в путь, но все равно не повезло.

Перед перезаписью

После перезаписи

ОБНОВЛЕНИЕ: я смог переписать на работу, изменив

context.Result = RuleResult.SkipRemainingRules;

до

context.Result = RuleResult.EndResponse;

Однако, когда я добираюсь до URL, он возвращает 200OK, но не показывает изображение. (см. прикрепленный файл)

Итак, сейчас единственный способ получить изображения - использовать Redirect

Переписать GET

...