未捕获的SyntaxError:实时但不是本地服务器上的意外令牌B.

所以我正在制作一些ajaxpost,它似乎在localhost上正常工作,但当我将它发布到amazon上的ec2服务器时,我得到Uncaught SyntaxError:意外的令牌B.这似乎指向JSON解析失败。 完全相同的数据库,相同的浏览器和相同的方法被调用。 为什么它可以在本地而不是服务器上运行。

$.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("
"), 'Uh oh'); } });

这是服务器端的基本布局:

 [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 errors = new List(); errors.Add(ex.Message); return Json(errors); } } 

try语句中,我对数据库进行了几个查询,并在Authorize.Net上发布了一些计算( https://api.authorize.net/soap/v1/Service.asmx )

如果Authorize.net Web服务调用有任何错误,那么我返回如下错误:

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

我正在记录的这个错误:

  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)

你有另一个post只能在实时服务器上找不到动作,在本地服务器上工作正常 ,所以我猜这篇文章与javascript片段有关,而不是服务器端片段。

听起来好像在服务器上发生了一些不好的事情,服务器发回某种类型的错误,并且当你试图处理那个响应时,你的error handling程序(在javascript中)就会死掉。

我得到Uncaught SyntaxError:意外的令牌B.这似乎指向JSON解析失败。

这听起来很合理。 我们来看看代码:

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

我强烈建议你看看xhr.responseText是什么。 我猜它不包含有效的JSON,因此parseJSON方法抛出’Unexpected token B’错误。

要查看此值,可以放入console.log(xhr.responseText); 或者您可以在Web浏览器或提琴手中使用类似javascript调试器的工具来查看其中的内容。

我的猜测是,服务器正在发送一个字符串, There was an error on the server而不是像您期望的那样JSON。 我看到你内置了error handling – 我的猜测是你的error handling中存在错误,并且没有什么可以捕获它。 我建议在服务器端进行调试,以查看是否存在您不期望的错误。

也许profile.messages只能枚举一次,当你再次尝试时它会抛出一个错误。 或者DB.SaveChanges可能由于某种原因抛出错误。 这些中的任何一个都会导致您在客户端看到的行为中显示的已记录消息。

您正在尝试使用自己的自定义响应内容返回400响应(错误请求)。

我认为IIS默认情况下不允许您这样做,并且正如CodeThug所提到的,可能正在用服务器消息替换您的自定义JSON内容。

但似乎您可以覆盖此行为:

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

    

过去在淘汰赛和引导程序中使用ASP.NET脚本捆绑时,我收到了类似的神秘错误,特别是在捆绑包中包含已经缩小的版本时。

如果您在localhost上以DEBUG模式运行,那么ASP.NET将不会缩小javascript库。 但是,一旦部署,您可能不再处于DEBUG模式,现在正在缩小/捆绑脚本。 有时,这些脚本的捆绑/缩小会导致类似于您发布的语法错误。

如果是这样,您可以从CDN加载knockout以避免捆绑。

似乎JSON发送,因为服务器的响应生成错误

 ex: if a value in the database is hi "my" friends JSON file will be generated as text:"hi "my" friends" 

所以很难生成属性文本的值。

生产/开发服务器中的这些值的双重检查值。

最佳实践是用转义字符替换引号

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