2017-05-25 2 views
4

Nous avons un projet d'API Web existant que nous souhaitons désormais servir à 2 clients à partir de la racine (accessible via différents sous-domaines). Quelle est la meilleure façon de configurer l'API Web pour exécuter les fonctions de diffusion de fichiers sur deux sites Web et sur les itinéraires de correspondance?Traitement des fichiers et des routes à partir de l'API Web

Je vois deux grandes options:

  1. Utilisez Kestrel comme un serveur de fichiers. Je ne suis pas sûr comment je configurerais Kestrel pour servir deux emplacements de racine (venant de différents sous-domaines). Il semble que la configuration minimale soit exposée telle quelle, et cela ne semble pas extensible pour desservir 2 sites basés sur un sous-domaine.

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

    De plus, je vais avoir du mal à intégrer en Kestrel avec l'API Web, voir ce StackOverflow question.

  2. Servir des fichiers à partir d'un contrôleur API Web responsable de la racine. Cela lirait l'URL et retournerait le bon index.html. De là, je ne sais pas comment cela servirait d'autres fichiers que les références index.html, comme js/app.js, css/core.css ou assets/*. Les contrôleurs individuels pourraient être faits pour les manipuler, mais cela semble fragile.

Laquelle de ces approches est appropriée? Ou y a-t-il autre chose que je n'ai pas envisagé pour accomplir cette fin?

+3

Ce que je ne comprends pas pourquoi vous voulez mélanger ASP.NET de base (en utilisant Kestrel) et Web API (System.Web) dans le même projet. Leur architecture est totalement différente (et je pense incompatible). Vous pouvez envisager d'utiliser Owin [capacités de routage natif] (https://stackoverflow.com/a/25405782/3670737) et servir des fichiers statiques avec quelque chose de similaire à [app.UseStaticFiles()] (https://msdn.microsoft.com /en-us/library/owin.staticfileextensions.usestaticfiles(v=vs.113).aspx). –

+1

J'ai fini par utiliser OWIN et cela a bien fonctionné pour mes besoins. La combinaison des informations contenues dans les liens du commentaire précédent a directement conduit à la mise en œuvre d'une solution. Merci @FedericoDipuma! –

Répondre

1

Comme par @ commentaire de FedericoDipuma, je me suis retrouvé à l'aide OWIN avec les éléments suivants 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); 
      }); 
     } 
    } 
}