【问题标题】:Serving Files and Routes from Web API从 Web API 提供文件和路由
【发布时间】:2017-10-26 14:56:01
【问题描述】:

我们有一个现有的 Web API 项目,我们现在也希望从根目录为 2 个客户端提供服务(通过不同的子域访问)。设置 Web API 以执行为两个网站提供文件并点击路由的功能的正确方法是什么?

我看到两个主要选项:

  1. 使用 Kestrel 作为文件服务器。我不确定如何配置 Kestrel 以从根(来自不同的子域)服务两个站点。它似乎暴露了最少的配置,并且这似乎无法扩展为基于子域为 2 个站点提供服务。

    var host = new WebHostBuilder()
       .UseKestrel()
       .UseWebRoot("wwwroot")
       .UseIISIntegration()
       .UseStartup<Startup>()
       .Build();
    
    host.Run();
    

    此外,我目前无法将 Kestrel 与 Web API 集成,请参阅StackOverflow question

  2. 从负责 root 的 Web API 控制器提供文件。这将读取 URL 并返回正确的 index.html。从那里我不确定它将如何为 index.html 引用的其他文件提供服务,例如 js/app.js、css/core.css 或 assets/*。可以让单独的控制器来处理这些,但这似乎很脆弱。

这些方法中哪一种是合适的?或者还有什么我没有考虑过的事情来实现这个目标?

【问题讨论】:

  • 我不明白为什么你想在同一个项目中混合使用 ASP.NET Core(使用 Kestrel)和 Web API(System.Web)。他们的架构完全不同(我认为不兼容)。您可以考虑使用 Owin native routing capabilities 并提供类似于 app.UseStaticFiles() 的静态文件。
  • 我最终使用了 OWIN,它很好地满足了我的需求。结合前面评论中链接中的信息,直接导致了解决方案的实施。谢谢@FedericoDipuma!

标签: c# asp.net-web-api kestrel-http-server fileserver


【解决方案1】:

根据@FedericoDipuma 的评论,我最终将 OWIN 与以下 Startup.cs 一起使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Owin;
using Microsoft.Owin.FileSystems;
using Microsoft.Owin.StaticFiles;
using System.IO;

namespace SealingServer
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals("subdomain1.site.com"), app2 =>
            {
                var firstClientRoot = Path.Combine("./firstClient/");
                var firstClientFileSystem = new PhysicalFileSystem(firstClientRoot);

                var fileServerOptions = new FileServerOptions();
                fileServerOptions.EnableDefaultFiles = true;
                fileServerOptions.FileSystem = firstClientFileSystem;
                fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] {"home.html"};
                fileServerOptions.StaticFileOptions.OnPrepareResponse = staticFileResponseContext =>
                {
                    staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" });
                };

                app2.UseFileServer(fileServerOptions);
            });
            app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals("subdomain2.site.com"), app2 =>  
            {
                var secondClientRoot = Path.Combine("./secondClient/");
                var secondClientFileSystem = new PhysicalFileSystem(secondClientRoot);

                var fileServerOptions = new FileServerOptions();
                fileServerOptions.EnableDefaultFiles = true;
                fileServerOptions.FileSystem = secondClientFileSystem;
                fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] { "home.html" };
                fileServerOptions.StaticFileOptions.OnPrepareResponse = staticFileResponseContext =>
                {
                    staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" });
                };

                app2.UseFileServer(fileServerOptions);
            });
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2012-05-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多