C# 如何在ASP.Net WebApi中正确配置路由问题

C# 如何在ASP.Net WebApi中正确配置路由问题,c#,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc 4,Asp.net Web Api,在开发了一个简单的测试ASP.NETWebAPI解决方案,将UnityInterfaceDI实现到我的控制器中之后,我遇到了一个问题:如何让我的API正确地路由到相关方法 键入以下URL将按预期返回第一个GET方法: http://localhost:1035/api/values 在控制器中键入参数以命中GetSelectedPerson方法将永远不会注册: http://localhost:1035/api/values/Test 希望有人能告诉我哪里出了问题,这是相关的代码 应用程序启

在开发了一个简单的测试ASP.NETWebAPI解决方案,将UnityInterfaceDI实现到我的控制器中之后,我遇到了一个问题:如何让我的API正确地路由到相关方法

键入以下URL将按预期返回第一个GET方法:

http://localhost:1035/api/values
在控制器中键入参数以命中GetSelectedPerson方法将永远不会注册:

http://localhost:1035/api/values/Test
希望有人能告诉我哪里出了问题,这是相关的代码

应用程序启动文件夹中的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 }
        );
    }
}
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);
    }
}
以下是来自App_Start文件夹的WebApi配置:

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 }
        );
    }
}
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;
    }

这是一个参数绑定问题。在默认路由中,预期参数名称为
id
,但是,在您的操作中,您有
nameoperson

这里有两个选项,您可以将
nameoperson
参数重命名为
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
    }
);

这是一个参数绑定问题。在默认路由中,预期参数名称为
id
,但是,在您的操作中,您有
nameoperson

这里有两个选项,您可以将
nameoperson
参数重命名为
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
    }
);