MVC WebApi路由找不到HTTP资源

时间:2019-07-17 09:19:06

标签: c# .net asp.net-mvc asp.net-web-api asp.net-web-api-routing

这是我第一次使用MVC,但是我一直在尝试使webApi路由正常工作。

我有一个看起来像这样的简单控制器

namespace XRM.Controllers
{
    public class PipelinesWebApiController : ApiController
    {
        static List<XRM.Models.XRM_PipelineStages> stages = new List<Models.XRM_PipelineStages>
        {
            new Models.XRM_PipelineStages() { stageName = "test" },
            new Models.XRM_PipelineStages() { stageName = "test2" },
            new Models.XRM_PipelineStages() { stageName = "test3" }
        };

        public IEnumerable<XRM.Models.XRM_PipelineStages> Get()
        {
            return stages;
        }

        public XRM_PipelineStages Get(int id)
        {
            return stages.FirstOrDefault(s => s.ROWUID == id);
        }
    }
}

WebApiConfig:

namespace XRM {

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {

            config.MapHttpAttributeRoutes();

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

}

Global.asax.cs

namespace XRM {

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

    }
}

每当我尝试使用

访问时
http://localhost:58061/api/PipelinesWebApi

我收到错误消息:

  

未找到与请求URI'http://localhost:58061/api/PipelinesWebApi'相匹配的HTTP资源。

我检查了 WebApiConfig.cs 中是否也有config.MapHttpAttributeRoutes();

我真的不知道为什么我似乎无法达到目标。

2 个答案:

答案 0 :(得分:1)

您的代码在我的末端运行良好。我无法重现此问题。无论如何,您可以尝试如下所示的另一种路由方式:

routeTemplate中将"api/{controller}/{action}/{id}"更改为WebApiConfig.cs,并调用该URL以及动作名称,例如api/PipelinesWebApi/Get

答案 1 :(得分:0)

由于基于约定的路由似乎无法正常工作,请考虑使用属性路由

[RoutePrefix("api/PipelinesWebApi")]
public class PipelinesWebApiController : ApiController {
    static List<XRM.Models.XRM_PipelineStages> stages = new List<Models.XRM_PipelineStages>
    {
        new Models.XRM_PipelineStages() { stageName = "test" },
        new Models.XRM_PipelineStages() { stageName = "test2" },
        new Models.XRM_PipelineStages() { stageName = "test3" }
    };

    //GET api/PipelinesWebApi
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get() {
        return Ok(stages);
    }

    //GET api/PipelinesWebApi/1
    [HttpGet]
    [Route("{id:int}")]
    public XRM_PipelineStages Get(int id) {
        var result = stages.FirstOrDefault(s => s.ROWUID == id);
        if(result != null) return Ok(result);

        return NotFound();
    }
}

引用Attribute Routing in ASP.NET Web API 2