2013-04-17 4 views
5

So mache ich einige Ajax Post und es scheint auf dem localhost gut zu funktionieren, aber wenn ich es auf ec2 Server auf Amazon veröffentlichen, bekomme ich Uncaught SyntaxError: Unexpected Token B. Was auf JSON-Analysefehler zu zeigen scheint. Genau dieselbe Datenbank, derselbe Browser und dieselben Methoden werden aufgerufen. Warum sollte es lokal und nicht auf dem Server funktionieren?Uncaught SyntaxError: Unerwarteter Token B auf Live aber nicht lokalen Server

$.ajax({ 
       url: '@Url.Action("Action")', 
       type: "POST", 
       data: ko.toJSON(viewModel), 
       dataType: "json", 
       contentType: "application/json; charset:utf-8", 
       success: function (result) { 

       }, 
       error: function (xhr, textStatus, errorThrown) { 
        var errorData = $.parseJSON(xhr.responseText); 
        var errorMessages = []; 

        for (var key in errorData) 
        { 
         errorMessages.push(errorData[key]); 
        } 
        toastr.error(errorMessages.join("<br />"), 'Uh oh'); 
       } 
      }); 

Hier wird das Grundlayout auf der Server-Seite ist:

[HttpPost] 
     public JsonResult Action(ViewModel model) 
     { 
      try 
      { 

       Response.StatusCode = (int)HttpStatusCode.OK; 
       return Json("Successfull"); 
      } 
      catch (Exception ex) 
      { 
       logger.Log(LogLevel.Error, string.Format("{0} \n {1}", ex.Message, ex.StackTrace)); 
       Response.StatusCode = (int)HttpStatusCode.BadRequest; 
       List<string> errors = new List<string>(); 
       errors.Add(ex.Message); 
       return Json(errors); 
      } 

     } 

Im Anweisung versuchen, mache ich ein paar Anfragen an die Datenbank und schreiben einige Berechnungen auf Authorize.Net (https://api.authorize.net/soap/v1/Service.asmx)

Wenn es einen Fehler mit Authorize.net Web Serviceaufrufen gibt, dann gebe ich Fehler wie folgt zurück:

if (profile.resultCode == MessageTypeEnum.Error) 
{ 
    logger.Log(LogLevel.Error, string.Join(",", profile.messages.Select(x => x.text))); 
    Response.StatusCode = (int)HttpStatusCode.BadRequest; 
    List<string> errors = new List<string>(); 
    profile.messages.ToList().ForEach(x => errors.Add(x.text)); 
    db.SaveChanges(); 
    return Json(errors); 
} 

Dieser Fehler, die ich Anmeldung:

A public action method 'AddPromoCode' was not found on controller 'Flazingo.Controllers.PositionController'. at 
System.Web.Mvc.Controller.HandleUnknownAction(String actionName) at 
System.Web.Mvc.Controller.ExecuteCore() at 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) at 
System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.b__5() at 
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() at 
System.Web.Mvc.MvcHandler.<>c__DisplayClasse.b__d() at 
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& 

completedSynchronously)

+0

Das klingt wie ein Server-Problem. Können Sie den serverseitigen Code hinter @ Url.Action ("Action") freigeben? – CodeThug

+0

@CodeThug Ich habe die serverseitigen Codes hinzugefügt. – jmogera

+0

@CodeThug irgendwelche Ideen. Bitte helfen Sie! – jmogera

Antwort

5

Sie haben einen anderen Posten an can't find action only on live server, works fine in local server, so vermute ich, dass dieser Beitrag speziell auf die Javascript Stücke verwandt ist, nicht die serverseitigen Stücke.

Es klingt wie etwas Schlimmes passiert auf dem Server, der Server sendet eine Art von Fehler zurück, und Ihre Fehlerbehandlung (in Javascript) stirbt, wenn Sie versuchen, diese Antwort zu behandeln.

I get Uncaught SyntaxError: Unexpected token B. Which seems to point to JSON parsing failure.

Das klingt ziemlich vernünftig. Schauen wir uns den Code aussehen:

.ajax({ 
    ... 
    error: function (xhr, textStatus, errorThrown) { 
     var errorData = $.parseJSON(xhr.responseText); 
     var errorMessages = []; 
     ... 
    }, 
    ... 
}); 

Ich würde einen Blick sehr empfehlen nehmen, was xhr.responseText ist. Ich vermute, dass es keinen gültigen JSON enthält, daher löst die parseJSON-Methode den Fehler 'Unerwarteter Token B' aus.

Um diesen Wert zu sehen, könnten Sie setzen console.log(xhr.responseText); oder Sie könnten ein Werkzeug wie den Javascript Debugger in Ihrem Webbrowser oder Fiddler verwenden, um zu sehen, was dort ist.

Meine Vermutung ist, dass der Server eine Zeichenfolge mit etwas wie anstelle von JSON zurücksendet, wie Sie erwarten. Ich sehe, dass Sie Fehlerbehandlung eingebaut haben - ich vermute, dass es einen Fehler in der Fehlerbehandlung gibt, und es gibt nichts, um es zu fangen. Ich würde empfehlen, Debugging auf der Serverseite zu tun, um zu sehen, ob irgendwo ein Fehler ist, den Sie nicht erwarten.

Vielleicht profile.messages ist etwas, das nur einmal aufgeführt werden kann, und wenn Sie es erneut versuchen, wird ein Fehler ausgegeben. Oder vielleicht wirft DB.SaveChanges aus irgendeinem Grund einen Fehler auf. Beides führt zu der protokollierten Nachricht, die Sie mit dem Verhalten sehen, das Sie auf der Clientseite sehen.

+0

Die Ausnahme tritt bei $ .parseJSON auf. Ich habe eine Testaktion erstellt, die nur einen Fehler zurückgibt. Keine serverseitige Berechnung – jmogera

+0

Also was ist der Wert von xhr.responseText? Das zu sehen, sollte die Situation erhellen. – CodeThug

+0

Bitte beachten Sie, dass, obwohl Ihre Testaktion keine serverseitige Berechnung durchführt, die Berechnung wahrscheinlich von serverseitigen Frameworks wie MVC durchgeführt wird und 'xhr.responseText' wahrscheinlich einen Fehler enthält, der aus irgendeinem Grund von einem Framework ausgelöst wird dass das Javascript nicht erwartet. Wenn wir den Fehler sehen (indem wir 'xhr.responseText' untersuchen), können wir sehen, wo das Problem liegt. – CodeThug

2

Ich habe ähnliche mysteriöse Fehler in der Vergangenheit erhalten, wenn ASP.NET Skriptbündelung auf Knockout und Bootstrap verwendet wurde, insbesondere wenn die bereits minimierten Versionen in einem Bundle enthalten sind.

Wenn Sie im DEBUG-Modus auf localhost ausgeführt werden, minimiert ASP.NET die JavaScript-Bibliotheken nicht.Nach der Bereitstellung befinden Sie sich jedoch vermutlich nicht mehr im DEBUG-Modus und minimieren bzw. bündeln die Skripts. Manchmal führt die Bündelung/Verkleinerung dieser Skripte zu ähnlichen Syntaxfehlern wie die von Ihnen geposteten.

Wenn dies der Fall ist, können Sie Knockout möglicherweise von einem CDN laden, um die Notwendigkeit der Bündelung zu vermeiden.

+0

Ah ich sehe. Dies könnte das Problem sein. Ich habe nur einen JSON zurückgegeben (Error = true) und es tritt immer noch auf. Ich denke also, dass es so sein könnte. Ich werde es ausprobieren. – jmogera

+0

Obwohl eine Sache zu beachten, habe ich keine Bündelung seit ich MVC3 bin. Ich habe die Web Essential Tools verwendet, um einige der js zu minimieren. – jmogera

4

Sie versuchen, eine 400-Antwort (Bad Request) mit Ihren eigenen benutzerdefinierten Antwort-Inhalt zurückzugeben.

Ich denke, dass IIS standardmäßig dies nicht zulässt, und wie CodeThug erwähnt, ersetzen Sie Ihren benutzerdefinierten JSON-Inhalt möglicherweise durch eine Server-Nachricht.

Aber es scheint, dass Sie dieses Verhalten außer Kraft setzen können:

http://develoq.net/2011/returning-a-body-content-with-400-http-status-code/

<system.webServer> 
    <httpErrors existingResponse="PassThrough"></httpErrors> 
</system.webServer> 
0

Es scheint, als Antwort vom Server JSON Senden schlecht

ex: if a value in the database is hi "my" friends 

    JSON file will be generated as text:"hi "my" friends" 

so Wert für Eigenschaft erzeugt wird Text wird schlecht generiert.

überprüfen Sie die Werte im Produktions-/Entwicklungsserver für solche Werte.

best practice ist ersetzen Zitate mit Escape-Zeichen

ex: text:"hi \"my\" friends" 
Verwandte Themen