如何将可选 URI 参数路由到 API 控制器函数
How to route Optional URI parameters to API Controller functions
我正在尝试使用 API 设置一个 Asp.Net 表单站点。
我已成功添加选择性身份验证,因此以“\api\”开头的页面不会被重定向,而是会挑战基本身份验证。
我现在正在尝试使用 MS Web Api 2 来执行 API 路由。
想法是尽可能RESTful。我有一个资源,一个 TradableItem,最初我想允许 API 用户以两种方式之一使用 HTTP GET。
如果 API 用户未传递任何项目密钥,则用户会收到可能的项目密钥列表
["ABC","DEF"...]
如果 API 用户将项目密钥作为 URI 的一部分传递,例如“/api/tradables/abc”,则为密钥=ABC 的项目返回 TradableItem 的表示。 (据我了解,这是标准的 REST 行为)。
在Global.ASAX的Application_Start()函数中我有一个这样的路线图...
RouteTable.Routes.MapHttpRoute(
name: "TradableItemVerbs",
routeTemplate: "api/tradables/{item}",
defaults: new { item = System.Web.Http.RouteParameter.Optional, controller = "Tradable" });
TradableController.cs 文件看起来像这样...
public class TradableController : ApiController
{
private static CustomLog logger = new CustomLog("TradableController");
// GET api/<controller>
public IEnumerable<string> GetKeys()
{
var prefix = "GetKeys() - ";
string msg = "";
msg = "Function called, returning list of tradable pkeys...";
logger.Debug(prefix + msg);
// Get a list of tradable items
return TradableManager.GetTradablePkeys();
}
// GET api/<controller>/<pkey>
public string GetTradable(string pkey)
{
string msg = string.Format("Would get Tradable data for key: >{0}<", pkey);
return msg;
}
}
问题是只有 GetKeys() 函数会触发,无论我是将 GET 调用到“/api/tradables”还是“/api/tradables/abc”。
作为参考,使用 VS2015 Community,IIS 7.5,目标 .Net 4.6.1。我使用 Rick Strahl 的博客作为这方面的指南(以及其他来源)。
http://weblog.west-wind.com/posts/2012/Aug/21/An-Introduction-to-ASPNET-Web-API#HTTPVerbRouting
请将您的参数名称更改为 item(因为这是路由中定义的名称):
public string GetTradable(string item)
{
....
}
或者当您调用方法时使用参数名称显式:/api/tradables?pkey=abc
我正在尝试使用 API 设置一个 Asp.Net 表单站点。 我已成功添加选择性身份验证,因此以“\api\”开头的页面不会被重定向,而是会挑战基本身份验证。 我现在正在尝试使用 MS Web Api 2 来执行 API 路由。
想法是尽可能RESTful。我有一个资源,一个 TradableItem,最初我想允许 API 用户以两种方式之一使用 HTTP GET。
如果 API 用户未传递任何项目密钥,则用户会收到可能的项目密钥列表
["ABC","DEF"...]
如果 API 用户将项目密钥作为 URI 的一部分传递,例如“/api/tradables/abc”,则为密钥=ABC 的项目返回 TradableItem 的表示。 (据我了解,这是标准的 REST 行为)。
在Global.ASAX的Application_Start()函数中我有一个这样的路线图...
RouteTable.Routes.MapHttpRoute(
name: "TradableItemVerbs",
routeTemplate: "api/tradables/{item}",
defaults: new { item = System.Web.Http.RouteParameter.Optional, controller = "Tradable" });
TradableController.cs 文件看起来像这样...
public class TradableController : ApiController
{
private static CustomLog logger = new CustomLog("TradableController");
// GET api/<controller>
public IEnumerable<string> GetKeys()
{
var prefix = "GetKeys() - ";
string msg = "";
msg = "Function called, returning list of tradable pkeys...";
logger.Debug(prefix + msg);
// Get a list of tradable items
return TradableManager.GetTradablePkeys();
}
// GET api/<controller>/<pkey>
public string GetTradable(string pkey)
{
string msg = string.Format("Would get Tradable data for key: >{0}<", pkey);
return msg;
}
}
问题是只有 GetKeys() 函数会触发,无论我是将 GET 调用到“/api/tradables”还是“/api/tradables/abc”。
作为参考,使用 VS2015 Community,IIS 7.5,目标 .Net 4.6.1。我使用 Rick Strahl 的博客作为这方面的指南(以及其他来源)。
http://weblog.west-wind.com/posts/2012/Aug/21/An-Introduction-to-ASPNET-Web-API#HTTPVerbRouting
请将您的参数名称更改为 item(因为这是路由中定义的名称):
public string GetTradable(string item)
{
....
}
或者当您调用方法时使用参数名称显式:/api/tradables?pkey=abc