为什么Web API没有找到我的资源?

时间:2016-08-01 00:00:13

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

我正在使用Web API 2并在ASP.Net 4中进行开发。这是我尝试学习webapi的示例代码。有两条路线。第一个路由是给定商店的服务资源。第二条路线是商店资源路线。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Services",
        url: "store/{id}/services",
        defaults: new { controller = "Services" }
    );

    routes.MapRoute(
        name: "Store",
        url: "store/{id}",
        defaults: new { controller = "Store", id = UrlParameter.Optional}
    );
}

第二条路线“商店”完美运作。第一条路线是详细介绍商店中可用的所有服务。当我尝试

  

/ API /存储/ 1 /服务

我收到404错误。有人能指出我做错了什么吗?

这是控制器

namespace APITestter1.Controllers
{
    public class ServicesController : ApiController
    {
        public string Get(int id, string prop = "xxx")
        {
            return "Hello services World!" + id + " added attribute " + prop;
        }

        public string Post(int id, string prop = "xxx")
        {
            return "Hello Post World!" + id + " added attribute " + prop;
        }

    }
}

2 个答案:

答案 0 :(得分:1)

您正在将Web api路由映射到错误的文件中。如果您正在使用web api,那么请查找WebApiConfig.cs文件并在那里映射您的web api路由。

您还尝试浏览/api/store/1/services,但在您的示例中,您将路线映射为store/{id}/services。请注意,您的路线模板中没有api

以下web api配置应与您尝试执行的操作相匹配

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

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "ServicesApi",
            routeTemplate: "api/store/{id}/services",
            defaults: new { controller = "Services" }
        );

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

你也说你的第二条路线" Store"效果很好,但没有显示您使用的URL。假设它是/api/store/1,那么它会起作用,因为它映射到使用DefaultApi的{​​{1}}路由模板。

答案 1 :(得分:1)

我不明白为什么前缀加“api”和“prop”?

我更新了你的代码:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Services",
            url: "api/store/{id}/services/{prop}",
            defaults: new { controller = "Services", action = "store", prop = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Store",
            url: "store/{id}",
            defaults: new { controller = "Store", id = UrlParameter.Optional}
        );
    }


namespace APITestter1.Controllers
{
    public class ServicesController : ApiController
    {
        [HttpGet, ActionName="store"]
        public string Get(int id, string prop = "xxx")
        {
            return "Hello services World!" + id + " added attribute " + prop;
        }

        [HttpPost, ActionName="store"]
        public string Post(int id, string prop = "xxx")
        {
            return "Hello Post World!" + id + " added attribute " + prop;
        }

    }
}