2016-08-04 91 views
2

我們開發了一個包含多個控制器的站點,它們接受GET和POST並返回視圖和JSON,並且在我們的開發環境中一切正常。Sitecore AJAX POST:無法調用操作方法

但是在客戶端的接受服務器上,我們遇到了一個問題:所有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請求。當然,這是配置問題。我應該在哪裏看?

回答

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>