1

我有一个Web API端点像下面的东西路由 -ASP.Net的Web API使用可选参数

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

正如你看到的,有4个参数到的WebAPI。但是,除第一个参数'userName'外,其他所有参数都是可选的。所有参数都是字符串类型,默认为空。

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

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

我期待它与任何工作 -

http://{base address}/V2/Core/Email/[email protected]&template=&subjectKey= 
http://{base address}/V2/Core/Email/[email protected] 

不工作。我得到了404.任何提示我做错了什么。我已经阅读过所有的SO和DOC链接,并且看起来有太多的信息需要处理。

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

更新:我得到它与第一个URL的工作,但我会期望它也与第二个API一起工作。还有一个信息,我的控制器有一组类似的输入参数多了一个动作,但动作的名称是不同的(可以以任何方式搞砸了?)

+0

你需要澄清什么是不工作的手段。你有错误吗?是行动命中但参数为空。期望的行为是什么? – Nkosi

+0

我更新了我的问题。基本上我得到了一个404. – Dibzmania

+0

然后你需要提供一个[mcve],可以用来重现问题。显示更多的目标控制器。以及更多路线配置。这些通常是可能导致您的问题的两个主要方面。 – Nkosi

回答

1

试试这个:

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

其中,userName是必需的,但templatesubjectKey是可选的。

网址,看起来就像这样(supoussing即template等于template1subjectKey等于3):

http://{base address}/V2/Core/Email/ResetPassword/[email protected]/template1/3 

或者说,没有任何参数,可以只userName

http://{base address}/V2/Core/Email/ResetPassword/[email protected] 

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

URL输入:在Controller收到

enter image description here

PARAMS:

enter image description here

+0

在我的情况下,客户端发送参数作为查询参数的一部分。在你显示的例子中,这些参数是作为路由值的一部分发送的。有没有办法对查询参数做同样的事情? – Dibzmania

+0

我只是做了一个测试,是的,它可以作为查询参数发送,我会更新我的答案 – Flxtr