【问题标题】:How to correctly configure a route issue in ASP.Net WebApi如何在 ASP.Net WebApi 中正确配置路由问题
【发布时间】:2013-11-06 20:20:16
【问题描述】:

在开发了一个简单的测试 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);
    }
}

这是我在“值”控制器中实现的两个 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;
    }

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api


    【解决方案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
        }
    );
    

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多