在开发一个简单的测试ASP.Net WebApi解决方案以将Unity接口DI实现到我的控制器之后,我遇到了让我的API正确路由到相关方法的问题。
键入以下URL将按预期返回第一个GET方法:
http://localhost:1035/api/values
从未注册在控制器中输入命中GetSelectedPerson方法的参数:
http://localhost:1035/api/values/Test
希望有人可以告诉我哪里出错了,继承了相关的代码。
App_Start文件夹中的RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
以下是App_Start文件夹中的WebApi配置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new
{
id = RouteParameter.Optional
}
);
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
}
以下是我在'Values'控制器中实现的两个GET HTTP方法:
public class ValuesController : ApiController
{
private IPersonCreator _createPerson;
public ValuesController(IPersonCreator createPerson)
{
_createPerson = createPerson;
}
//GET api/values
public IPerson Get()
{
return _createPerson.CreateNewPerson();
}
//**********Issue: This Method is never hit.**********
public IPerson GetSelectedPerson(string nameOfPerson)
{
IPerson selectedPerson = null;
var returnedPeople = _createPerson.CreateNewPeople();
foreach (var person in returnedPeople)
{
if (person.Name == "John")
{
selectedPerson = person;
}
}
return selectedPerson;
}
答案 0 :(得分:1)
这是一个参数绑定问题。在默认路由中,预期参数名称为id
,但是,在您的操作中,您有nameOfPerson
。
此处有两个选项,您可以将nameOfPerson
参数重命名为id
,即
public IPerson GetSelectedPerson(string id)
或者添加特定的路由,该路由需要nameOfPerson
参数,即
// place after default route
config.Routes.MapHttpRoute(
name: "PersonByNameApi",
routeTemplate: "api/{controller}/{nameOfPerson}",
defaults: new
{
nameOfPerson = RouteParameter.Optional
}
);