Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Asp.Net Core 2.2在子域上设置服务器映像?_C#_Asp.net Core_Asp.net Core 2.0_Asp.net Core 2.2 - Fatal编程技术网

C# 如何使用Asp.Net Core 2.2在子域上设置服务器映像?

C# 如何使用Asp.Net Core 2.2在子域上设置服务器映像?,c#,asp.net-core,asp.net-core-2.0,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.0,Asp.net Core 2.2,我有一个应用程序是使用Asp.NETCore2.2框架顶部的C 35;编写的 该应用程序旨在显示大量照片。我试图通过利用一个无Cookie子域来提高应用程序的性能,以减少从服务器请求图像时的流量 目前,我使用UseStaticFiles扩展名,允许使用以下URL访问我的照片https://example.com/photos/a/b/c/1.jpg。相反,现在我想更改URL以使用https://photos.example.com/a/b/c/1.jpg。下面是我当前如何使用usesticfil

我有一个应用程序是使用Asp.NETCore2.2框架顶部的
C 35;
编写的

该应用程序旨在显示大量照片。我试图通过利用一个无Cookie子域来提高应用程序的性能,以减少从服务器请求图像时的流量

目前,我使用
UseStaticFiles
扩展名,允许使用以下URL访问我的照片
https://example.com/photos/a/b/c/1.jpg
。相反,现在我想更改URL以使用
https://photos.example.com/a/b/c/1.jpg
。下面是我当前如何使用
usesticfiles
扩展名来提供图像

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 framework在
photos.example.com
子域上为我的图像提供服务,而不需要第二个运行的应用程序?

我将任何性能关键的东西放入了我的中间件中。在中间件中,您可以检查主机和/或路径,并将文件直接写入响应流,并使返回短路

您只需添加一个如下所示的中间件类:

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);
    }
  }
}
使用Microsoft.AspNetCore.Http;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Hosting;
中产阶级
{
private readonly RequestDelegate\u next;
公共中间层(下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文)
{
string req_path=context.Request.path.Value;
字符串host=context.Request.host.Value;
if(host.StartsWith(“照片”)){
context.Response.Clear();
context.Response.StatusCode=200;
context.Response.ContentType=“”;
wait context.Response.SendFileAsync();
返回;
}
否则{
wait_next.Invoke(上下文);
}
}
}
然后,在Startup.cs的配置方法中,您必须使用中间件:

app.UseMiddleware<Middle>();
app.UseMiddleware();
如何让服务器将子域和裸域视为同一应用程序取决于您使用的服务器。在IIS中,您可以创建两个指向同一应用程序的不同站点,并使用同一应用程序池(至少在旧的.NET中是这样)。您也可以只给images站点一个唯一的端口号,因为我认为cookie是特定于主机端口组合的


您需要确保该中间件首先运行,这样它就可以防止它之后的任何东西运行。当然,除非您希望为静态内容运行某种身份验证,否则我会将任何性能关键的东西放入我的中间件中。在中间件中,您可以检查主机和/或路径,并将文件直接写入响应流,并使返回短路

您只需添加一个如下所示的中间件类:

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);
    }
  }
}
使用Microsoft.AspNetCore.Http;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Hosting;
中产阶级
{
private readonly RequestDelegate\u next;
公共中间层(下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文)
{
string req_path=context.Request.path.Value;
字符串host=context.Request.host.Value;
if(host.StartsWith(“照片”)){
context.Response.Clear();
context.Response.StatusCode=200;
context.Response.ContentType=“”;
wait context.Response.SendFileAsync();
返回;
}
否则{
wait_next.Invoke(上下文);
}
}
}
然后,在Startup.cs的配置方法中,您必须使用中间件:

app.UseMiddleware<Middle>();
app.UseMiddleware();
如何让服务器将子域和裸域视为同一应用程序取决于您使用的服务器。在IIS中,您可以创建两个指向同一应用程序的不同站点,并使用同一应用程序池(至少在旧的.NET中是这样)。您也可以只给images站点一个唯一的端口号,因为我认为cookie是特定于主机端口组合的


您需要确保该中间件首先运行,这样它就可以防止它之后的任何东西运行。当然,除非您希望对静态内容运行某种身份验证

否则,可以使用
IFileProvider
访问照片。我如何使用IFileProvider提供的内容进行响应?在您的示例中,您的硬编码http代码为200,但如果请求的照片不存在怎么办?@Junior-您可以使用IFileProvider获取IFileInfo以获取路径。如果文件不存在,你必须决定怎么做;我不能告诉你。也许你应该返回500状态。也许你应该返回一个带有错误信息的200状态。可能是特朗普穿着Speedo的照片……或者梅勒妮娅穿着Speedo的照片?这些照片可以通过使用IFileProvider访问。我如何使用IFileProvider提供的内容进行回复?在您的示例中,您的硬编码http代码为200,但如果请求的照片不存在怎么办?@Junior-您可以使用IFileProvider获取IFileInfo以获取路径。如果文件不存在,你必须决定怎么做;我不能告诉你。也许你应该返回500状态。也许你应该返回一个带有错误信息的200状态。也许是特朗普穿着Speedo的照片……或者梅勒妮娅穿着Speedo的照片?