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

标签 c# asp.net-mvc asp.net-web-api owin

我快被这个搞疯了。

我正在使用 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;
}

关于c# - Api Controller 可以工作,但 web razor Controller 不能使用 owin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28805751/

相关文章:

c# - .* 在正则表达式中做什么?

asp.net-mvc - Asp.Net Mvc 4 源代码?

asp.net - 在 OSX 上开发 asp.net 会面临哪些限制(如果有)? (2015/2016年度)

asp.net-mvc - 如何在 ASP.NET MVC Razor View 上嵌入 rdl 报告?

rest - restful web api中的双因素身份验证

asp.net - 从 web api 服务下载 pdf 文件的问题

c# - 避免特定方法的 CamelCasePropertyNamesContractResolver

c# - Visual Studio - TabControl.TabPages.Insert 不工作

javascript - 等号中的空格

C# iTextSharp 单个单元格中的多种字体