MVC App中的API控制器无法正常工作

时间:2016-02-03 12:50:02

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

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

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

请求的网址:/ 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 }
        );
    }
}

这是我的web 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);
}

没有出现任何构建错误。任何帮助表示赞赏

4 个答案:

答案 0 :(得分:2)

Hy Guys。感谢您的帮助。我已经找到了解决方案。答案是在Global.asax.cs中,

 GlobalConfiguration.Configure(WebApiConfig.Register) 
必须在

之前调用

 RouteConfig.RegisterRoutes(RouteTable.Routes).

答案 1 :(得分:1)

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 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

编辑:删除了冗余代码