我的问题特别是如果我可以支持这样的事情
public class SomeTestController : ApiController
{
[System.Web.Http.AcceptVerbs("GET")]
public SomeInfo GetSomeBlah(int a, int b)
{
return new SomeInfo
{
Name = string.Format("GetSomeBlah - {0}", a),
CompanyID = b.ToString()
};
}
[System.Web.Http.AcceptVerbs("GET")]
public SomeInfo GetSomeBlah1(int a, int b)
{
return new SomeInfo
{
Name = string.Format("GetSomeBlah1 - {0}", a),
CompanyID = b.ToString()
};
}
}
我尝试添加以下路线
config.Routes.MapHttpRoute(
name: "DefaultApi4",
routeTemplate: "api/{controller}/{action}",
defaults: new {action = RouteParameter.Optional}
);
编辑:2015年4月7日
我忘了提到它也应该与其他风格的方法一起使用。
答案 0 :(得分:1)
不确定为什么要这样做,听起来你误解了路由是如何工作的 - 你有关于路由的seen these tutorials以及ASP.net如何映射路由吗?
从下面的3b点开始,这意味着如果您更有意义地命名输入变量,框架将能够映射来自路径的名称和类型,以确定选择哪种方法,即getSomeBlah或GetSomeBlack1
其他人的摘要,
1)。创建控制器上与HTTP请求方法匹配的所有操作的列表。
2)。如果路线词典有"动作"输入,删除名称与此值不匹配的操作。
3)。尝试将操作参数与URI匹配,如下所示:
A)。对于每个操作,获取一个简单类型的参数列表,其中绑定从URI获取参数。排除可选参数。
B)。从此列表中,尝试在路径字典或URI查询字符串中查找每个参数名称的匹配项。匹配不区分大小写,不依赖于参数顺序。
C)。选择列表中的每个参数在URI中都匹配的操作。
d)。如果多一个操作符合这些条件,请选择参数匹配最多的一个。
4)。使用[NonAction]属性忽略操作。
答案 1 :(得分:0)
如果删除默认路由,那将会有效。我还指出了参数的来源。
指定输入来自URL:
public SomeInfo GetSomeBlah([FromUri] int a, [FromUri] int b)
评论或删除此内容:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
测试网址:
响应:
<ValuesController.SomeInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SampleMVC.Controllers"> <CompanyID>2</CompanyID><Name>GetSomeBlah - 1</Name> </ValuesController.SomeInfo>
答案 2 :(得分:0)
像这样配置:
config.Routes.MapHttpRoute("DefaultApi2",
"apiws/{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
config.Routes.MapHttpRoute("DefaultApi",
"apiws/{controller}/{id}",
new { id = RouteParameter.Optional });
这适用于休息风格和非休息风格apis。 请注意,这两个语句的顺序很重要。
答案 3 :(得分:0)
我设法使用以下代码
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
和属性路由。
[RoutePrefix("api/someother")]
public class SomeOtherController : ApiController
{
// GET: api/SomeOther
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/SomeOther/5
public string Get(int id)
{
return "value";
}
// POST: api/SomeOther
public void Post([FromBody]string value)
{
}
// PUT: api/SomeOther/5
public void Put(int id, [FromBody]string value)
{
}
[System.Web.Http.HttpGet()]
[System.Web.Http.Route("Findsomething2")]
public CompanyInfo Findsomething2(int id, int b)
{
return new CompanyInfo
{
CompanyID = b.ToString(),
Name = id.ToString() + " 2"
};
}
// DELETE: api/SomeOther/5
public void Delete(int id)
{
}
}