Sitecore AJAX POST: 无法调用操作方法

Sitecore AJAX POST: Could not invoke action method

我们开发了一个具有多个控制器的站点,可以接受 GET 和 POST 以及 return 视图和 JSON,并且在我们的开发环境中一切正常。

但是在客户端的接受服务器上我们遇到了一个问题:所有的 GET return 都很好,但是 POSTs return 描述了一个错误 here by John West。 Stacktrace 是相同的。

System.InvalidOperationException: Could not invoke action method: askquestion. Controller name: Assistance. Controller type: [Namespace].Assistance.Controllers.AssistanceController

我们使用为每个控制器定义路由的方法:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <initialize>
        <processor type="[Namespace].Assistance.Pipelines.RegisterWebApiRoutes, [Namespace].Assistance"
                   patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']" />
      </initialize>
    </pipelines>
  </sitecore>
</configuration>

处理器是这​​样的:

public class RegisterWebApiRoutes
{
    public void Process(PipelineArgs args)
    {
        RouteTable.Routes.MapRoute(
            name: "Assistance.Api",
            url: "api/assistance/{action}",
            defaults:new {controller = "Assistance" });
    }
}

动作方法是这样的

[HttpPost]
public ActionResult AskQuestion(AskQuestionViewModel model)
{
    if (ModelState.IsValid)
    {
        ....

        return View("Confirmation");
    }
    else
    {
        return View(model);
    }
}

这是怎么回事? Sitecore 以某种方式阻止了 AJAX POST 请求。当然,这是配置问题。我应该看哪里?

好的,我找到问题的根源了。

他们 URL 使用一条规则重写模块:LowerCaseRule1(或者可能是任何其他规则)。但是当它开始工作时,请求变成了 GET。然后控制器找不到相应的 GET 操作,瞧:无法调用操作方法。

我只是在重写规则中添加了例外,它起作用了。

<rewrite>
  <rules>
    <rule name="LowerCaseRule1" stopProcessing="true">
      <match url="[A-Z]" ignoreCase="false" />
      <action type="Redirect" redirectType="Permanent" url="{ToLower:{URL}}" />
      <conditions>
        <add input="{URL}" pattern="^.*\.(axd|ashx|asmx|lic|ico|swf|less|aspx|ascx|css|js|jpg|jpeg|png|gif)$" negate="true" ignoreCase="true" />                

        <!-- here is my exception -->
        <add input="{URL}" pattern="/api/assistance" negate="true" />   
      </conditions>
    </rule>
  </rules>
</rewrite>