C# 设置WebApi 2路由

C# 设置WebApi 2路由,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我对WepApi2和创建restfull Web服务相当陌生,但我掌握了其中的大部分诀窍 最近,我开始开发一个新的WebApi2,在这里我遇到一些查询需要一些不可容纳的字符,特别是斜杠和倒斜杠字符 我在这里读了一些关于这个问题的教程和问题,但是没有一个能满足我的要求,所以我最终像这样设置了我的api查询 http://host/controler/action/?param1=x&param2=y 一切都很完美。我必须为我的动作设置ActionName和Route属性,这没有问题,但有

我对WepApi2和创建restfull Web服务相当陌生,但我掌握了其中的大部分诀窍

最近,我开始开发一个新的WebApi2,在这里我遇到一些查询需要一些不可容纳的字符,特别是斜杠和倒斜杠字符

我在这里读了一些关于这个问题的教程和问题,但是没有一个能满足我的要求,所以我最终像这样设置了我的api查询

http://host/controler/action/?param1=x&param2=y
一切都很完美。我必须为我的动作设置
ActionName
Route
属性,这没有问题,但有一次我尝试了旧的查询方式

http://host/controller/action/x/y
我总是会得到一个
在控制器“controller”上找不到与请求匹配的操作。

这是我的路线配置

// Web API configuration and services
            config.MapHttpAttributeRoutes();
            // Web API routes
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { controller = "HelloWorld", id = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(
                name: "Config1",
                routeTemplate: "{controller}/{action}/{param1}/{param2}/{param3}",
                defaults: new { controller = "Controller", action = "action", param2 = RouteParameter.Optional, param3 = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(
                name: "Config2",
                routeTemplate: "{controller}/{param1}/{param2}/{param3}",
                defaults: new { controller = "action", param3 = RouteParameter.Optional }
            );
您可能会注意到我有两种配置。第一种方法是将动作分类到一个控制器下,因此,将来可以添加更多具有特定动作的控制器,而不是拥有一个具有特定动作的控制器的庞大列表,但是第二种方法是客户机想要的

那么,有没有办法让这两种方式共同工作

编辑:我的坏,我忘了显示我的控制器和操作是如何安装的

public class ControllerController : WebApiController
    {
        [Route("Controller/action1/")]
        [ActionName("action1")]
        [HttpGet()]
        public Object action1(string param1, string param2)
        {
            // do action actions code
            return result;
        }
如您所见,除了在配置中设置路由外,我还设置了操作路由属性,但我不知道我可以设置多个路由属性。我会试试,然后回来报到

您可以尝试改用:

您可以尝试改用:


在这种情况下,我建议改为基于属性的路由,而不是字符串路由。属性路由允许您在控制器类中分配规则,而不是在基于字符串匹配的单独路由配置中,并且在处理路由组合时更加健壮。哦,忘了提了,请看我的编辑!在这种情况下,我建议改为基于属性的路由,而不是字符串路由。属性路由允许您在控制器类中分配规则,而不是在基于字符串匹配的单独路由配置中,并且在处理路由组合时更加健壮。哦,忘了提了,请看我的编辑!哦,这样我就可以两全其美了?我已经有属性路由,请看我的编辑,但我不知道它支持超过1个设置哦,所以我可以设置两种方式?我已经有属性路由,请看我的编辑,但我不知道它支持超过1个设置
// in your startup configuration:

config.MapHttpAttributeRoutes();

// and your controller:

[RoutePrefix("foo")]
public class FooController
{
    [HttpGet]
    [Route("bar/{param1}/{param2}")]
    [Route("bar")
    public IHttpActionResult GetBar(string param1, string param2)
    {
        // ...
    }
}