DynamicRouteValueTransformer 改变值没有任何影响

Posted

技术标签:

【中文标题】DynamicRouteValueTransformer 改变值没有任何影响【英文标题】:DynamicRouteValueTransformer changing values doesn't have any effects 【发布时间】:2020-05-10 17:15:22 【问题描述】:

我正在尝试创建一个使用插件进行端点处理的 webapi

我有一个计算控制器

[Route("api/[controller]")]
public class CalculateController : Controller

    [HttpGet("functionName")]
    public IActionResult Get(string functionName)
    
      /// some logic here  
    

这应该响应 /api/calculate/house

我在启动中添加了一个 TranslationTransformer,我看到它被激活了

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    //hidden for abbreviate 
    app.UseEndpoints(endpoints =>
    
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "controller=Home/action=Index/id?");
        endpoints.MapDynamicControllerRoute<TranslationTransformer>("api/controller/**action");
    );

我实现了一些可以改变translationtransformer中的值的逻辑

public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)

    RouteConfig dynamicRoute =  GetDynamicRoute(values);

    if (dynamicRoute != null)
    
        values["controller"] = dynamicRoute.Controller;
        values["action"] = dynamicRoute.Action;
    

    return values;

测试结果:

测试用例 1

/api/calculate/房子

启动 TranslationTransformer 值[“控制器”]:“计算” values["action"] : "房子"

没有更改结果控制器被激活:OK

测试用例2

/api/demo/假的

启动 TranslationTransformer 值[“控制器”]:“演示” 值[“动作”]:“假”

no change result controller 没有被激活:OK

testcase3

/api/demo/假的

启动 TranslationTransformer 值[“控制器”]:“演示” 值[“动作”]:“假”

改变 值[“控制器”]:“计算” values["action"] : "房子"

结果控制器未激活:不好

测试用例 4

/api/calculate/房子

启动 TranslationTransformer 值[“控制器”]:“计算” values["action"] : "房子"

改变 值[“控制器”]:“演示” 值[“动作”]:“假”

结果控制器被激活:不行

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我已经弄清楚缺少什么。

显然值并不是决定控制器选择的唯一元素。这在测试用例 4 中显示

所以你可以盲目地采用有效请求的值。

controller的value和action其实就是controller的名字和需要激活的方法。

在我的例子中,它是控制器:计算。但是作为操作,方法的名称必须是:Get

我仍然觉得有点令人费解,为什么将名称更改为有效请求的值不会导致相同的行为。

【讨论】:

以上是关于DynamicRouteValueTransformer 改变值没有任何影响的主要内容,如果未能解决你的问题,请参考以下文章