我遇到了一个问题,与我们的付款处理操作方法(由第三方在线付款提供商调用)的重构有关。我们有一个产品控制器,在类级别上具有
在进行此重构之前,
手动浏览到该 URL 会导致在
问题在于,在
我该如何在调用
[Authorize]
和[RoutePrefix("products")]
属性,并包括以下操作方法:
- 路由属性为
[Route("{productCode}")]
的Product(string contractNumber)
- 路由属性为
[Route("{productCode}")]
和[HttpPost]
属性的MakePayment(string productCode, PaymentAmountType? amountSelection, decimal? amountValue)
- 路由属性为
[Route("{productCode}")]
的ProcessPayment(string productCode, string result)
ProcessPayment
操作,所以我们不得不将其重构为没有[Authorize]
属性的单独控制器。(我们已经有机制来防止重复记账付款。)在进行此重构之前,
MakePayment
操作方法正确地通过以下对Url.Action()
的调用制定了正确的返回URL:var rawCallbackUrl = Url.Action("ProcessPayment", new { productCode = productCode });
ProcessPayment
操作方法已经从产品控制器中移出,并移至一个名为 ExternalCallbackController
的新控制器中,该控制器没有任何属性(更不用说 [Authorize]
了),以避免向支付提供商返回 HTTP 401 响应。
ProcessPayment
上的路由属性现在是 [Route("order-processing/{productCode}/process-payment")]
,以避免与产品控制器上的 RoutePrefix
冲突。所有对该更新后的操作方法的引用都需要更新为指定 ExternalCallbackController
。手动浏览到该 URL 会导致在
ProcessPayment
中设置的断点被命中,因此路由显然成功工作。问题在于,在
MakePayment
中,以下调用返回 null
:var rawCallbackUrl = Url.Action("ProcessPayment", "ExternalCallback", new { productCode = productCode });
既然我同时指定了控制器和操作方法,为什么Url.Action(...)
没有返回预期的URL格式order-processing/{productCode}/process-payment
?
从第一天开始,我们在RouteConfig
中的RegisterRoutes()
方法已经正确地初始化了属性路由。
routes.MapMvcAttributeRoutes();
我该如何在调用
Url.Action(...)
时获得正确的URL返回?