Skip to main content
 首页 » 编程设计

c#之Api Controller 可以工作,但 web razor Controller 不能使用 owin

2024年08月06日37mq0036

我快被这个搞疯了。

我正在使用 Visual Studio 2012 Premium、.NET Framework 4.5.1 和 C# 开发 ASP.NET Web Api 2.2 项目。

我创建了一个空的 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类,请告诉我,我添加。

请您参考如下方法:

您需要为 Controller 使用 MapRoute。

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

MapRoute 是一种扩展方法,其中 MvcRouteHandler 被设置为请求的路由处理程序。如果您没有映射给定的路由以供 MvcRouteHandler 处理,那么您就没有使用导致实例化 Controller 的 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; 
}