2016-11-12 22 views
1

dotnet core APIに仮想ディレクトリを追加しようとしています。あなたは以下の私のIISのプロジェクト構成で見ることができるようにしかし、それは私に404IIS 8上の仮想dotnet core apiアプリケーションの仮想ディレクトリにアクセスできない

This api.project.nl page can’t be found 

No web page was found for the web address: 

https://api.project.nl/v1/uploads/profiles/profile.jpeg 

を与える私は、メインのIIS Webサイトの下にv1として私APIを設定しています。 APIはうまく動作し、wwwrootのフォルダーにも届きます。これはindex.html(カスタムスワッガーのuiドキュメント用)です。

enter image description here

私はProjects - Apiフォルダ

https://api.project.nl/uploads/profiles/profile.jpeg 

uploadsフォルダに到達することができますが、それはv1仮想アプリケーションの下uploadsフォルダに到達することはできません。

https://api.project.nl/v1/uploads/profiles/profile.jpeg 

何故でしょうか?その可能性があるのか​​どうかは分かりませんが、これについてのいくつかの指摘を感謝します。私は、例えばhereのようないくつかの関連する質問を見たことがありますが、私の設定は一歩先です。彼らはおよそUseFileServerdocsを話し、彼らはそれがで動作するようになったが、私はそれはそれをすべての作業を取得できないようです。私も。

ない、必要に応じて確認してくださいが、ここは私のStartUp.cs

であることを必要とする本当にわかりません
public class Startup 
{ 
    public IConfigurationRoot Configuration { get; } 

    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    // This method gets called by the runtime. Use this method to add services to the container 
    public void ConfigureServices(IServiceCollection services) 
    {    
     services.Configure<RouteOptions>(options => options.LowercaseUrls = true); 

     services.ConfigureSwaggerGen(options => 
     { 
      options.SingleApiVersion(new Info 
      { 
       Version = "v1", 
       Title = "Project Web Api Docs", 
       TermsOfService = "None", 
       Contact = new Contact { Name = "-", Email = "-", Url = "https://project.nl" } 
      }); 
     }); 

     services.AddMvc(config => 
     { 
      // add policy for a global '[Authorize]' attribute filter, 
      // so it doesn't have to be placed on all controllers 
      var policy = new AuthorizationPolicyBuilder() 
         .RequireAuthenticatedUser() 
         .Build(); 

      config.Filters.Add(new AuthorizeFilter(policy)); 
     }); 

     // Configure rollbar error reporting 
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
     services.AddRollbarWeb(Configuration); 
     services.AddSingleton(Configuration); 

     // inject an implementation of ISwaggerProvider with defaulted settings applied   
     services.AddSwaggerGen(); 

     services.AddOptions(); 

     // Inject the api settings 
     services.Configure<ApiSettings>(Configuration.GetSection("ApiSettings")); 

     // Configure mappings 
     Mappings.ConfigureMappings(); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     // Configure CORS settings 
     app.UseCors(builder => 
      builder.WithOrigins("http://localhost:9000", "http://localhost:8100", "https://connect.project.nl") 
       .AllowAnyMethod() 
       .AllowAnyHeader() 
       .AllowCredentials() 
      ); 

     // Configure rollbar 
     app.UseRollbarExceptionHandler(); 

     app.UseJwtBearerAuthentication(new JwtBearerOptions 
     { 
      Audience = Configuration["ApiSettings:Auth0:ClientId"], 
      Authority = $"https://{Configuration["ApiSettings:Auth0:Domain"]}/" 
     }); 

     app.UseMvc(); 

     // enable static files, for the wwwroot (and accompanying docs in it) 
     // also enable 'default files', such as default.htm, index.html etc. 
     app.UseDefaultFiles(); 
     app.UseStaticFiles(); 

     // enable middleware to serve generated Swagger as a JSON endpoint 
     app.UseSwagger(routeTemplate: "docs/{apiVersion}/swagger.json"); 
    } 
} 
+2

IISでASP.NETコアアプリケーションを実行すると、IISはリバースプロキシとしてのみ機能し、すべての要求をKestrelにリダイレクトし、kestrelは仮想フォルダを認識しないからです。 ASP.NETコアアプリケーションは、HttpPlatformHandlerではなく、HttpPlatformHandlerのフォークであるASPNetCoreHandlerによって処理されます – Tseng

+0

コメントをいただきありがとうございます。それは少し明確になりました:) –

答えて

2

私は@Tsengに同意していますが、私は事次の行を追加します。ASP.netコアが、それはいくつかの要求を処理するかでIISなどの仮想ディレクトリまたはアプリケーションを管理していないので、マルチplateform用にビルドされ

  1. 他のOSも同様です。 あなたのケースでは、V1はあなたのメインアプリケーションのアプリケーションです

  2. もしあなたがこのようなことをしなければならない場合、あなたは次のことをしなければなりません。

    app.UseFileServer(new FileServerOptions() 
        { 
         FileProvider = new PhysicalFileProvider(<<your physical path>>), 
         RequestPath = new PathString("/V1"), 
         EnableDirectoryBrowsing = true // you make this true or false. 
        }); 
    

この設定を行うたら、IISで設定する必要はありません。

+0

ありがとうございました。あなたのお許しを使いました –

関連する問題