【问题标题】:API controller in MVC App not workingMVC 应用程序中的 API 控制器不起作用
【发布时间】:2016-05-12 16:21:11
【问题描述】:

我已经使用 SSO 创建了一个 mvc 应用程序。我添加了一个 Api 控制器,但每当我尝试从中获取数据时,都会出错。
URI=https://localhost:44305/api/graph/get

错误: “/”应用程序中的服务器错误。 无法找到该资源。 说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的 URL:/api/graph/get 这是我的路线配置

public class RouteConfig
{
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        //routes.MapRoute(
        //    name: "Default",
        //    url: "{controller}/{action}/{id}",
        //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute(
            name: "Default",
            url: "api/{controller}/{action}/{id}",
            defaults: new { controller = "Graph", action = "Get", id = UrlParameter.Optional }
        );
    }
}

这是我的网络 api 控制器

public JsonResult<List<Claim>> Get()
{
        var principal = (User as ClaimsPrincipal);
        List<Claim> claimsList = new List<Claim>();
        foreach (var claim in principal.Claims)
        {
            claimsList.Add(claim);
        }
        return Json<List<Claim>>(claimsList);
}

没有收到任何构建错误。任何帮助表示赞赏

【问题讨论】:

  • @Stefan 浏览器显示“应用程序中的服务器错误“/”。找不到资源
  • 你能看到被请求的http地址吗?
  • 尝试打开 Windows Event Viewer 应用程序并查看 Windows Logs\Application。您应该会在其中看到任何与 ASP.NET 相关的错误,这可能会提示您网站的问题所在。
  • @Stefan 没有写请求的 url:graph/get
  • 为什么在MVC 路由配置中设置api 路由而不是WebApiConfig.cs

标签: c# asp.net-mvc visual-studio asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

嗨,伙计们。感谢您的所有帮助。我已经想出了解决方案。答案是在 Global.asax.cs 中,

 GlobalConfiguration.Configure(WebApiConfig.Register) 

必须在之前调用

 RouteConfig.RegisterRoutes(RouteTable.Routes).

【讨论】:

  • 说真的,您在上面两次得到了答案。可能应该只是在中发表评论
  • @jolySoft 请仔细阅读。我的问题是我在全局配置之前调用了路由配置。我也试图帮助其他可能有同样问题的人
  • 如果您对 global.asax.cs 有疑问,请编辑您的问题以将其包含在其中的错误中。这也有助于给出简洁的答案。谢谢你
  • @jolySoft 我以前不知道 global.asax.cs 中的问题。这就是为什么我把它贴在这里。而且我认为发布答案而不是说出问题本身的答案会更好。
【解决方案2】:
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}",
        defaults: new { controller = "Default", action = "Index", id = UrlParameter.Optional }
    );
    }
}


public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultDataApi",
            routeTemplate: "Api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}


public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        FluentValidationModelValidatorProvider.Configure();
    }
}

【讨论】:

  • 我也对 global.asax.cs 进行了更改
【解决方案3】:

你应该有 2 个配置文件:

RoutesConfig.cs 和 WebApiConfig.cs

RoutesConfig 应该如下所示:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        Log.Instance().Debug("Registering Routes");
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    }
}

WebApiConfig.cs 应该如下所示:

public static class WebApiConfig
{
    public static void Configure(HttpConfiguration config)
    {
        ConfigureRouting(config);
        ConfigureFormatters(config);
    }

    private static void ConfigureFormatters(HttpConfiguration config)
    {
        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new NiceEnumConverter());
    }

    private static void ConfigureRouting(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

在 global.asax.cs 中你应该有这样的东西:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // Register them in this order
        GlobalConfiguration.Configure(WebApiConfig.Configure); //registers WebApi routes
        RouteConfig.RegisterRoutes(RouteTable.Routes);  //register MVC routes
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

您的控制器确实看起来有点奇怪,为什么不让默认序列化程序为您处理事情:

public IEnumerable<Claim> Get()
{
        var principal = (User as ClaimsPrincipal);
        List<Claim> claimsList = new List<Claim>();
        foreach (var claim in principal.Claims)
        {
            claimsList.Add(claim);
        }
        return claimsList;
}

编辑:删除冗余代码

【讨论】:

    【解决方案4】:

    假设您的控制器名称是 GraphController,我认为您应该使用的 url 是 /api/graph/get。

    如果名称不同,则需要相应地调整 url。

    另外,在 MVC 项目中有一个单独的 .cs 文件,您应该使用它来管理 WebAPI 路由 - WebApiConfig.cs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多