2016-08-04 12 views
2

Wir haben eine Site mit mehreren Controllern entwickelt, die GET und POST akzeptieren und Ansichten und JSON zurückgeben. In unserer Entwicklungsumgebung funktioniert alles einwandfrei.Sitecore AJAX POST: Aktionsmethode konnte nicht aufgerufen werden

Aber auf dem Akzeptanzserver des Clients haben wir ein Problem: Alle GETs geben ihre Ergebnisse gut zurück, aber die POSTs geben einen Fehler here by John West zurück. Der Stacktrace ist identisch.

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

Wir verwenden den Ansatz der Route für jeden Regler zu definieren:

<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> 

Der Prozessor ist wie folgt:

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

die Aktionsmethode ist wie folgt

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

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

Was passiert? Irgendwie blockiert Sitecore AJAX POST Anfragen. Definitiv ist dies das Konfigurationsproblem. Wo soll ich hinschauen?

Antwort

2

OK, ich habe die Quelle des Problems gefunden.

Sie hatten URL-Rewrite-Modul mit einer Regel: LowerCaseRule1 (oder es kann jede andere sein). Aber als es seine Arbeit machte, wandte sich die Anfrage an GET. Dann konnte der Controller die entsprechende GET-Aktion nicht finden und voila: konnte die Aktionsmethode nicht aufrufen.

Ich habe einfach die Ausnahme in Rewrite-Regeln hinzugefügt und es hat funktioniert.

<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> 
Verwandte Themen