2015-07-31 10 views
6

Mam aplikację ASP.NET 5 MVC 6 zawierającą niestandardowe strony błędów. Jeśli teraz chcesz dodać kontroler interfejsu API w ścieżce /api, widziałem następujący wzór przy użyciu metody Mapa:Korzystanie z interfejsu Web API wewnątrz aplikacji ASP.NET 5 MVC 6

public class Startup 
{ 
    public void Configure(IApplicationBuilder application) 
    { 
     application.Map("/api", ConfigureApi); 

     application.UseStatusCodePagesWithReExecute("/error/{0}"); 

     application.UseMvc(); 
    } 

    private void ConfigureApi(IApplicationBuilder application) 
    { 
     app.Run(async (context) => 
     { 
      await context.Response.WriteAsync("Hello World from API!"); 
     }); 
    } 
} 

Powyższy kod tworzy zupełnie nowy odrębny wniosek w ścieżce /api. To jest świetne, ponieważ nie chcesz tworzyć niestandardowych stron z błędami dla swojego Web API, ale chcesz je dla swojej aplikacji MVC.

Czy mam rację sądząc, że w programie ConfigureApi powinienem dodać MVC ponownie, aby móc używać kontrolerów? Jak skonfigurować usługi, opcje i filtry dla tej podaplikacji? Czy istnieje sposób, aby uzyskać ConfigureServices(IServiceCollection services) dla tej podaplikacji?

private void ConfigureApi(IApplicationBuilder app) 
{ 
    application.UseMvc(); 
} 

Odpowiedz

3

Oto jak można zrobić z trochę metodę rozszerzenia umożliwiające "middleware" warunkowe wykonanie:

public class Startup { 
    public void Configure(IApplicationBuilder app) { 
     app.UseWhen(context => !context.Request.Path.StartsWithSegments(new PathString("/api")), branch => { 
      // Register the status code middleware, but only for non-API calls. 
      branch.UseStatusCodePagesWithReExecute("/error/{0}"); 
     }); 

     app.UseMvc(); 
    } 
} 


public static class AppBuilderExtensions { 
    public static IApplicationBuilder UseWhen(this IApplicationBuilder app, 
     Func<HttpContext, bool> condition, Action<IApplicationBuilder> configuration) { 
     if (app == null) { 
      throw new ArgumentNullException(nameof(app)); 
     } 

     if (condition == null) { 
      throw new ArgumentNullException(nameof(condition)); 
     } 

     if (configuration == null) { 
      throw new ArgumentNullException(nameof(configuration)); 
     } 

     var builder = app.New(); 
     configuration(builder); 

     return app.Use(next => { 
      builder.Run(next); 

      var branch = builder.Build(); 

      return context => { 
       if (condition(context)) { 
        return branch(context); 
       } 

       return next(context); 
      }; 
     }); 
    } 
} 
+0

@ Muhammad-Rehan-Saeed Czy masz powodzenie tej operacji? Czy to też powinno działać na MVC 5? – orad

+0

@orad zachęcamy do otwarcia osobnego pytania, jeśli szukasz wersji OWIN/Katana 'UseWhen'. Udostępnij link tutaj, a ja dodam jeden. – Pinpoint

Powiązane problemy