Как я могу сервировать изображения на поддомене с Asp.Net Core 2.2? - PullRequest
3 голосов
/ 01 ноября 2019

У меня есть приложение, написанное с использованием C# поверх платформы Asp.Net Core 2.2.

Приложение предназначено для отображения большого количества фотографий. Я пытаюсь улучшить производительность приложения, используя субдомен Cookie-Free для уменьшения трафика при запросе изображений с сервера.

В настоящее время я использую расширение UseStaticFiles, чтобы разрешить доступ к моим фотографиям с помощью следующегоURL https://example.com/photos/a/b/c/1.jpg. Вместо этого теперь я хочу изменить URL для показа этих фотографий, используя https://photos.example.com/a/b/c/1.jpg. Вот как я использую расширение UseStaticFiles для предоставления изображений в настоящее время

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = blobFileProvider,
    RequestPath = "/photos",
    OnPrepareResponse = ctx =>
    {
        const int durationInSeconds = 3600 * 72;

        ctx.Context.Response.Headers[HeaderNames.CacheControl] = "public,max-age=" + durationInSeconds;
    }
});

Я уверен, что могу создать второе приложение для изображений, но как я могу использовать инфраструктуру Asp.Net Core 2.2 для обслуживания моих изображенийна photos.example.com субдомен без необходимости запуска второго приложения?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Я бы ветвил конвейер запроса, используя метод MapWhen . Затем примените UseStaticFiles, как вы сделали.

Конечный результат будет выглядеть следующим образом

app.MapWhen(context => {
    return context.Request.Host.Value.StartsWith("photos.", StringComparison.OrdinalIgnoreCase)
} (appBuilder) =>
{
    appBuilder.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = blobFileProvider,
        OnPrepareResponse = ctx =>
        {
            const int durationInSeconds = 3600 * 72;
            ctx.Context.Response.Headers[HeaderNames.CacheControl] = "public,max-age=" + durationInSeconds;
        }   
    });
});
0 голосов
/ 01 ноября 2019

Я помещаю в свой MiddleWare все, что критично для производительности. В MiddleWare вы можете проверить хост и / или путь и записать файл непосредственно в поток ответов и замкнуть возврат.

Вам просто нужно добавить класс MiddleWare, который выглядит примерно так:

using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

public class Middle
{
  private readonly RequestDelegate _next;

  public Middle(RequestDelegate next)
  {
    _next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    string req_path = context.Request.Path.Value;
    string host = context.Request.Host.Value;

    if (host.StartsWith("photos.")) {
      context.Response.Clear();
      context.Response.StatusCode = 200;
      context.Response.ContentType = "<Image Type>";
      await context.Response.SendFileAsync(<file path>);
      return;
    }
    else {
      await _next.Invoke(context);
    }
  }
}

Тогда в вашем методе Configure Startup.cs вы должны использовать MiddleWare:

app.UseMiddleware<Middle>();

То, как ваш сервер обрабатывает поддомен и пустой домен, зависит от одного и того же приложения. на каком сервере вы используете. В IIS вы можете просто создать 2 разных сайта, которые направлены на одно и то же приложение и использовать один и тот же пул приложений (по крайней мере, это работало в старых .NET). Вы также можете просто дать сайту изображений уникальный номер порта, потому что я думаю, что файлы cookie являются специфическими для комбо порта хоста.

Вы должны убедиться, что это промежуточное программное обеспечение запускается первым, поэтому оно может предотвратитьчто-нибудь после этого от запуска. Если, конечно, вы не хотите, чтобы какая-то аутентификация выполнялась для статического контента

...