Question

I have visual studio 2012 installed with mvc4 using .net framework 4.5. Now I want to use webapi2 with attribute writing and i want my hlep page show all the endpoints properly.

In my solution i added a new mvc4 base emtpy project and using nuget i upgraded to mvc5 and then i have installed webapi2 packages. lastly i have installed help package for webapi2.

now when i use routeprefix I cant see any content on help page and when i try to access my webapi endpoint in browsers it throws following error.

http://expressiis.com/api/v1/

   <Error>
    <Message>
    No HTTP resource was found that matches the request URI 'http://expressiis.com/api/v1/'.
    </Message>
    <MessageDetail>
    No type was found that matches the controller named 'v1'.
    </MessageDetail>
    </Error>

namespace WebApi.Controllers
{
    [RoutePrefix("api/v1")]
    public class SubscribersController : ApiController
    {
        // GET api/<controller>   
        [Route("")]
        [HttpGet]
        public IQueryable<string> Get()
        {
            return new string[] { "value1", "value2" }.AsQueryable();
        }


    }
}
Was it helpful?

Solution

Based on your information, it looks like you are not calling the httpConfig.MapHttpAttributeRoutes() (Make sure to call this before any traditional routing registrations)

Since you haven't called MapHttpAttributeRoutes, your request seems to be matching a traditional route, for example, like api/{controller}. This will not work because routes matching traditional routes will never see controllers/actions decorated with attribute routes.

OTHER TIPS

A problem I ran into was related to the ordering in Application_Start(). Note the order of Web API configuraton below:

This does NOT work

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

This does work

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

I had this problem too and after a long search I realized that I was using System.Web.Mvc.RouteAttribute instead of System.Web.Http.RouteAttribute After correcting this and using config.MapHttpAttributeRoutes() everything worked fine.

This was not your case (as is apparent from your sample code), but please do remember to end the Controller class name with Controller.

Else it won't be picked up by config.MapHttpAttributeRoutes();.

This question already has a selected answer. But I had a different solution for myself and think it would be helpful to reply if the selected answer doesn't help.

For me it was a silly mistake. I had two controllers but only one was working. The solutions was that my controller class was named improperly!

My working controller-

public class FooController : ApiController { }

My non-working controller-

public class BarControllers : ApiController { }

Be sure your controller class ends in Controller. The trailing s got me!

Make sure you don't have two controllers with the same name! I was moving some controllers from one assembly I was throwing away into the website... whilst the website no longer had references to the old assembly other assemblies did which meant it was copied in to the WebSite bin folder. The route discovery process then seemed to fail silently when it came across two occurrences of the same controller!

In my case, VS create my controller with the name

TestController1

I dont know why he put this number "one" in the end of name, but remove and will work.

In my case, I was missing full custom path in attributes. I was writing only custom action name without 'api/'. So that was my mistake. My scenario was, WebApiConfig template code:

        // Web API routes
        config.MapHttpAttributeRoutes();

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

my incorrect way of route

[RoutePrefix("myapps")]  // wrong code
public class AppsController : BaseRestAPIController
{
    [HttpPost]
    [Route("getapps")]
    public ResponseData GetAppList()
    {

Correct way

[RoutePrefix("api/myapps")]  // correct way. full path start from 'api/'
public class AppsController : BaseRestAPIController
{
    [HttpPost]
    [Route("getapps")]
    [Route("api/myapps/getapps")] // you can use full path here, if you dont want controller level route
    public ResponseData GetAppList()
    {

In my case following line was creating problem, just commented it and everything start working

config.MapHttpAttributeRoutes();

Comment it in WebApiConfig.cs file

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top