2015-03-02 2 views
1

Я с ума схожу с этим.Контроллеры Api работают, но сетевые контроллеры бритвы не с owin

Я разрабатываю проект ASP.NET Web Api 2.2 с Visual Studio 2012 Premium, .NET Framework 4.5.1 и C#.

Я создал пустой проект ASP.NET MVC 5. Я удалил Global.asax и создать этот Startup.cs класс:

using Microsoft.Owin; 
using Ninject; 
using Ninject.Web.Common.OwinHost; 
using Ninject.Web.WebApi.OwinHost; 
using Owin; 
using System.Reflection; 
using System.Web.Http; 
using System.Web.Routing; 
using MyProject.Web.API.App_Start; 

[assembly: OwinStartup(typeof(MyProject.Web.API.Startup))] 
namespace MyProject.Web.API 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 

      var webApiConfiguration = new HttpConfiguration(); 
      webApiConfiguration.Routes.MapHttpRoute(
       name: "Default", 
       routeTemplate: "{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional }); 

      webApiConfiguration.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      webApiConfiguration.Routes.MapHttpRoute(
       name: "ProductionOrderActionApi", 
       routeTemplate: "api/MyProductionOrders/{orderNumber}/{action}", 
       defaults: new { controller = "MyProductionOrders" }); 

      app.UseNinjectMiddleware(CreateKernel); 
      app.UseNinjectWebApi(webApiConfiguration); 
     } 

     private static StandardKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 

      RegisterServices(kernel); 

      return kernel; 
     } 

     private static void RegisterServices(IKernel kernel) 
     { 
      var containerConfigurator = new NinjectConfigurator(); 
      containerConfigurator.Configure(kernel); 
     } 
    } 
} 

Проект отлично с ApiController классов работает, но когда я пытаюсь получить доступ к Controller я получаю HTTP 404 код Статус: не найден.

Что мне нужно сделать, чтобы разрешить веб-страницы? Я думаю, проблема связана с Routes, но я попытался добавить RouteConfig к проекту, но я не знаю, как это сделать.

Я много искал в Google, но я не нашел ничего, связанного с моим вопросом (или, возможно, я не поставил правильный поисковый запрос).

Если вам нужен класс NinjectConfigurator, пожалуйста, сообщите мне, и я добавлю его.

+0

Что Ссылка 404ing? – rism

+0

Если это не так глупо, потому что вы определили RouteConfig.RegisterRoutes (RouteTable.Routes); в верхней части Startup.Configuration, а затем в RegisterRoutes у вас по-прежнему есть маршрут по умолчанию, тогда любой вызов, чтобы сказать api/MyProductionOrders/{orderNumber}, будет поднят по этому маршруту контроллера по умолчанию ... поэтому я бы переместил RouteConfig.RegisterRoutes (RouteTable.Routes) ниже параметров webApiConfiguration.Routes .....но тогда вы говорите, что маршруты api попадают, но не контроллеры, поэтому это не должно быть проблемой. – rism

+0

Основываясь на днях попыток, это выглядит как * none * ответов на самом деле работает при запуске Self Hosted .... –

ответ

3

Вы должны использовать MapRoute для контроллеров.

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 

MapRoute является метод расширения и в том, что MvcRouteHandler настроен в качестве обработчика маршрута для запроса. Если вы не сопоставили данный маршрут, который должен обрабатывать MvcRouteHandler, тогда вы не будете задействовать конвейер обработки запросов Mvc, который приводит к созданию экземпляра контроллера.

MapRoute использует MvcRouteHandler

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) 
    { 
     if (routes == null) 
     throw new ArgumentNullException("routes"); 
     if (url == null) 
     throw new ArgumentNullException("url"); 
     Route route = new Route(url, (IRouteHandler) new MvcRouteHandler()) 
     { 
     Defaults = RouteCollectionExtensions.CreateRouteValueDictionaryUncached(defaults), 
     Constraints = RouteCollectionExtensions.CreateRouteValueDictionaryUncached(constraints), 
     DataTokens = new RouteValueDictionary() 
     }; 
     ConstraintValidation.Validate(route); 
     if (namespaces != null && namespaces.Length > 0) 
     route.DataTokens["Namespaces"] = (object) namespaces; 
     routes.Add(name, (RouteBase) route); 
     return route; 
    } 

MapHttpRoute использует HttpMessageHandler:

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler) 
{ 
    if (routes == null) 
    throw Error.ArgumentNull("routes"); 
    HttpRouteValueDictionary routeValueDictionary1 = new HttpRouteValueDictionary(defaults); 
    HttpRouteValueDictionary routeValueDictionary2 = new HttpRouteValueDictionary(constraints); 
    IHttpRoute route = routes.CreateRoute(routeTemplate, (IDictionary<string, object>) routeValueDictionary1, (IDictionary<string, object>) routeValueDictionary2, (IDictionary<string, object>) null, handler); 
    routes.Add(name, route); 
    return route; 
} 
+0

Спасибо, но теперь моя проблема в том, что я не знаю, как добавить его в класс «Startup». Я сделал это в «Global.asax», но я понятия не имею, как это сделать в «Startup». – VansFannel

+1

Вы делаете это точно так же. Вы получаете коллекцию маршрутов из статического вызова в RouteTable.Routes, поэтому в моем ответе выше: var routes = RouteTable.Routes; routes.MapRoute (......); – rism

+0

На самом деле у вас все еще есть RouteConfig.RegisterRoutes (RouteTable.Routes); в вашем классе Startup, чтобы вы могли просто поместить MapRoutes в свой метод RouteConfig.RegisterRoutes, как обычно. – rism

0

Для меня это действительно похоже, что настройка маршрутизации не установлена, поскольку вы только определили маршруты для webapi. Конфигурация маршрутизации для mvc и webapi немного отличается, поэтому вы не можете настроить маршрутизацию так, как вы там делали. Цитата из книги я читаю:

Ключа избежать конфликта между рамками является осторожным маршрут установки; чтобы облегчить это, по умолчанию ASP.NET Web API будет занимать URI пространство под/api, тогда как все остальные URL-адреса корневого уровня будут обработаны MVC. Обычно маршруты веб-API определены в статическом классе WebApiConfig против объекта HttpConfiguration и его свойства Route, тогда как маршруты MVC определены в статическом классе RouteConfig непосредственно против System.Web.RouteCollection.

//Web API routing configuration 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 
      config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
      ); 
     } 
    } 
    //MVC routing configuration 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
+0

Спасибо, но ... как вы называете 'WebApiConfig' и' RouteConfig' из класса 'Startup'? – VansFannel

Смежные вопросы