Asp.net web api WebAPI路由协助

Asp.net web api WebAPI路由协助,asp.net-web-api,asp.net-mvc-routing,Asp.net Web Api,Asp.net Mvc Routing,学习了很多关于地图布线的知识,花了太多的时间试图完成我需要的工作,所以我希望有人能帮我。:) 我希望做到以下几点: /api/Entities/1是一个非常好的参考 不使用答案有点冗长,因为如果要匹配同一个动词,RPC样式(Action)和Rest方法不能很好地共存。正如您所注意到的,GET()和DOSOMETHING()被视为同一控制器上的重复方法签名。要解决此问题,您可以尝试使用两个控制器: 所以我建议使用路由;但是,可以使用正常方法: 使用标准路由… 像这样设置您的路线 c

学习了很多关于地图布线的知识,花了太多的时间试图完成我需要的工作,所以我希望有人能帮我。:)

我希望做到以下几点:

/api/Entities/1是一个非常好的参考

不使用答案有点冗长,因为如果要匹配同一个动词,RPC样式(Action)和Rest方法不能很好地共存。正如您所注意到的,GET()和DOSOMETHING()被视为同一控制器上的重复方法签名。要解决此问题,您可以尝试使用两个控制器:

所以我建议使用路由;但是,可以使用正常方法:

使用标准路由…

像这样设置您的路线

        config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        config.Routes.MapHttpRoute(
            name: "ActionDefaultApi",
            routeTemplate: "api/entities/{action}/{actionId}",
            defaults: new
                          {
                              //Add more as needed
                              action = "(|dosomething|dosomethingelse)",
                              actionId = RouteParameter.Optional,
                              controller = "EntitiesRpc"
                          });
控制器1:

public class EntitiesController : ApiController
{
    public string Get()
    {
        return "http://server/api/Entities";
    }

    public string Get(string id)
    {
        return string.Format("http://server/api/Entities/{0}", id);
    }
}
public class EntitiesRpcController : ApiController
{
    [HttpGet]
    public string DoSomething()
    {
        return "http://server/api/Entities/doSomething";
    }

    [HttpGet]
    public string DoSomething(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
    }

    [HttpGet]
    public string DoSomethingElse()
    {
        return "http://server/api/Entities/doSomethingelse";
    }

    [HttpGet]
    public string DoSomethingElse(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
    }
}
控制器2:

public class EntitiesController : ApiController
{
    public string Get()
    {
        return "http://server/api/Entities";
    }

    public string Get(string id)
    {
        return string.Format("http://server/api/Entities/{0}", id);
    }
}
public class EntitiesRpcController : ApiController
{
    [HttpGet]
    public string DoSomething()
    {
        return "http://server/api/Entities/doSomething";
    }

    [HttpGet]
    public string DoSomething(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
    }

    [HttpGet]
    public string DoSomethingElse()
    {
        return "http://server/api/Entities/doSomethingelse";
    }

    [HttpGet]
    public string DoSomethingElse(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
    }
}
现在假设您使用了基于属性的路由,您可以返回到一个控制器并使用如下内容:

public class EntitiesController : ApiController
{
    [Get("Entities")]
    public string Get()
    {
        return "http://server/api/Entities";
    }

    [Get("Entities/{id}")]
    public string Get(string id)
    {
        return string.Format("http://server/api/Entities/{0}", id);
    }

    [Get("Entities/doSomething")]
    public string DoSomething()
    {
        return "http://server/api/Entities/doSomething";
    }

    [Get("Entities/doSomething/{actionId}")]
    public string DoSomething(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
    }

    [Get("Entities/doSomethingelse")]
    public string DoSomethingElse()
    {
        return "http://server/api/Entities/doSomethingelse";
    }

    [Get("Entities/doSomethingelse/{actionId}")]
    public string DoSomethingElse(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
    }
}

AttributeRouting.net确实是答案。非常非常酷。:)@MichaelDBang很高兴这有帮助。如果你对此感到满意,你能接受这个答案吗?啊。。。真是个新手。我试着“上”它,但它不允许我。。。没有看到复选框。好了!再次感谢。