为什么 Web API 找不到我的资源?
Why Web API is not finding my resource?
我正在使用 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}
);
}
第二条路线"Store"完美运行。第一条路线是详细了解商店中提供的所有服务。当我尝试
/api/store/1/services
我收到 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;
}
}
}
您在错误的文件中映射了网络 api 路由。如果你正在做网络 api 然后寻找 WebApiConfig.cs
文件并在那里映射你的网络 api 路线。
您还尝试浏览至 /api/store/1/services
,但在您的示例中,您将路线映射为 store/{id}/services
。请注意,您的路线模板中没有 api
。
以下网络 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
那么它会起作用,因为它映射到使用 api/{controller}/{id}
的 DefaultApi
路由模板。
不明白为什么前缀要加"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;
}
}
}
我正在使用 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}
);
}
第二条路线"Store"完美运行。第一条路线是详细了解商店中提供的所有服务。当我尝试
/api/store/1/services
我收到 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;
}
}
}
您在错误的文件中映射了网络 api 路由。如果你正在做网络 api 然后寻找 WebApiConfig.cs
文件并在那里映射你的网络 api 路线。
您还尝试浏览至 /api/store/1/services
,但在您的示例中,您将路线映射为 store/{id}/services
。请注意,您的路线模板中没有 api
。
以下网络 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
那么它会起作用,因为它映射到使用 api/{controller}/{id}
的 DefaultApi
路由模板。
不明白为什么前缀要加"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;
}
}
}