我们开发了一个具有多个控制器的站点,这些控制器接受GET和POST并返回视图和JSON,并且在我们的开发环境中一切正常。
但是在客户端的验收服务器上我们遇到了一个问题:所有GET都返回了他们的结果,但POST返回了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请求。当然,这是配置问题。我应该在哪里看?
答案 0 :(得分:2)
好的,我找到了问题的根源。
他们的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>