ASP.Net Web API 带可选参数的路由

ASP.Net Web API Routing with optional parameters

我有一个 Web API 端点,如下所示 -

[HttpPost]  
[ActionName("ResetPassword")]   
public HttpResponseMessage ResetPassword(string userName, string Template, string SubjectKey,[FromBody] Dictionary<string, string> KeyWords)

如您所见,Web 有 4 个参数API。但是,除了第一个参数 'userName' 之外,所有其他参数都是可选的。所有参数均为字符串类型,默认可为空。

我已经使用基于约定的路由配置了路由(这是一个遗留项目)。

Config.Routes.MapHttpRoute(
             name: "ResetPasswordResetV2",
             routeTemplate: "Email/ResetPassword",
             defaults: new { controller = "Email", action = "ResetPassword", routeValue = true });

我期待它能与任何一个一起工作 -

http://{base address}/V2/Core/Email/ResetPassword?userName=hdhd@hshshs.com&template=&subjectKey=
http://{base address}/V2/Core/Email/ResetPassword?userName=hdhd@hshshs.com

不工作。我得到一个 404。任何提示我做错了什么。我已经阅读了各种 SO 和文档链接,看起来有太多信息需要处理。

另外,这个'routeValue = true'是什么意思?

更新:我在第一个 URL 上使用它,但我希望它也能在第二个 API 上使用。多一个信息,我的控制器还有一个具有相似输入参数集的动作,但动作名称不同(这会以任何方式搞砸吗?)

试试这个:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{userName}/{template}/{subjectKey}",
    defaults: new { controller = "Email", action = "ResetPassword", template = UrlParameter.Optional, subjectKey = UrlParameter.Optional 
});

其中,userName是必填项,templatesubjectKey是可选的。

URLs,看起来像这样(假设 template 等于 template1 并且 subjectKey 等于 3):

http://{base address}/V2/Core/Email/ResetPassword/hdhd@hshshs.com/template1/3

或者,没有任何参数,只有 userName:

http://{base address}/V2/Core/Email/ResetPassword/hdhd@hshshs.com

如果完全有必要,您可以将信息作为查询参数发送,但必须在 Controller 中指明。

URL 输入:

Controller 中收到的参数: