gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:48 24 4
gpt4 key购买 nike

我快被这个搞疯了。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com