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

4
我们开发了一个具有多个控制器的网站,它们接受GET和POST请求并返回视图和JSON。在我们的开发环境中一切正常。但是,在客户端验收服务器上出现了问题:所有的GET请求都能成功返回结果,但是POST请求返回错误,并且这个错误在John West的博客中有描述。堆栈跟踪相同。
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请求。这肯定是一个配置问题。我应该在哪里查找?

1个回答

2

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

他们使用了URL Rewrite模块并配置了一个规则: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>

你在哪个文件中进行了这些修改? - EnterTheCode
1
在 web.config 文件中,在 IIS 安装 URL Rewrite 模块后。 - Pavel Jounda
当你说“他们”时,你是指Sitecore还是你的客户? - Mhoque
是的,“they” 指的是客户。 - Pavel Jounda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接