MVC 应用程序中的 API 控制器不起作用

本文关键字:控制器 不起作用 API 应用程序 MVC | 更新日期: 2023-09-27 18:33:12

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

错误:"/"应用程序中的服务器错误。 找不到资源。说明:HTTP 404。要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。 请查看以下 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);
}

未收到任何生成错误。任何帮助不胜感激

MVC 应用程序中的 API 控制器不起作用

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

 GlobalConfiguration.Configure(WebApiConfig.Register) 

必须在之前调用

 RouteConfig.RegisterRoutes(RouteTable.Routes).
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();
    }
}

你应该有 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;
}

编辑:删除冗余代码

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

如果它的名称不同,则需要相应地调整网址。

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