2013-04-17 21 views
5

Vì vậy, tôi đang tạo một số bài đăng ajax và có vẻ hoạt động tốt trên máy chủ cục bộ, nhưng khi tôi xuất bản lên máy chủ ec2 trên amazon, tôi nhận được Uncaught SyntaxError: B. Điều này dường như chỉ ra lỗi phân tích cú pháp JSON. Cơ sở dữ liệu tương tự, cùng một trình duyệt và các phương thức giống nhau được gọi. Tại sao nó hoạt động trên máy cục bộ chứ không phải trên máy chủ.Uncaught SyntaxError: Mã thông báo không mong muốn B trên máy chủ trực tiếp nhưng không phải địa phương

$.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'); 
       } 
      }); 

Dưới đây là cách bố trí cơ bản về phía máy chủ:

[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); 
      } 

     } 

Trong thử tuyên bố, tôi làm một vài truy vấn đến cơ sở dữ liệu và gửi một số tính toán trên Authorize.Net (https://api.authorize.net/soap/v1/Service.asmx)

Nếu có lỗi với lệnh gọi dịch vụ web Authorize.net thì tôi sẽ trả về lỗi như sau:

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); 
} 

Lỗi này mà tôi đang đăng nhập:

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

này nghe có vẻ như một vấn đề máy chủ. Bạn có thể chia sẻ mã phía máy chủ sau @ Url.Action ("Hành động") không? – CodeThug

+0

@CodeThug Tôi đã thêm mã phía máy chủ. – jmogera

+0

@CodeThử bất kỳ ý tưởng nào. Hãy giúp tôi! – jmogera

Trả lời

5

Bạn có một bài tại can't find action only on live server, works fine in local server, vì vậy tôi đoán rằng bài này được cụ thể liên quan đến các mảnh javascript, không các phần phía máy chủ.

Có vẻ như có điều gì đó xấu xảy ra trên máy chủ, máy chủ gửi lại một số loại lỗi và trình xử lý lỗi của bạn (trong javascript) chết khi cố gắng xử lý phản hồi đó.

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

Điều đó nghe khá hợp lý. Hãy xem mã:

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

Tôi rất muốn giới thiệu xem một số xhr.responseText là gì. Tôi đoán rằng nó không chứa JSON hợp lệ, do đó phương thức parseJSON sẽ ném lỗi 'Mã thông báo không mong muốn B'.

Để xem xét giá trị này, bạn có thể đặt console.log(xhr.responseText); hoặc bạn có thể sử dụng công cụ như trình gỡ lỗi javascript trong trình duyệt web của bạn hoặc trình duyệt để xem nội dung ở đó.

Tôi đoán là máy chủ đang gửi lại chuỗi có nội dung như There was an error on the server thay vì JSON như bạn đang mong đợi. Tôi thấy rằng bạn đã xử lý lỗi được tích hợp - tôi đoán là có lỗi trong quá trình xử lý lỗi của bạn và không có gì để bắt lỗi. Tôi sẽ khuyên bạn nên làm gỡ lỗi ở phía máy chủ để xem nếu có một lỗi ở đâu đó mà bạn không mong đợi.

Có lẽ profile.messages là thứ chỉ có thể được liệt kê một lần và khi bạn cố gắng làm lại, nó sẽ phát sinh lỗi. Hoặc có thể DB.SaveChanges đang ném một lỗi vì một lý do nào đó. Một trong hai điều này sẽ dẫn đến thông báo được ghi lại mà bạn thấy với hành vi mà bạn thấy ở phía máy khách.

+0

Trường hợp ngoại lệ xảy ra tại $ .parseJSON. Tôi đã tạo một hành động thử nghiệm chỉ trả lại lỗi. Không có tính toán phía máy chủ. – jmogera

+0

Vậy giá trị của xhr.responseText là bao nhiêu? Thấy rằng cần thêm ánh sáng cho tình huống. – CodeThug

+0

Xin lưu ý rằng mặc dù hành động thử nghiệm của bạn không thực hiện bất kỳ tính toán phía máy chủ nào, có khả năng tính toán được thực hiện bởi các khung công tác phía máy chủ chẳng hạn như MVC và 'xhr.responseText' có thể có lỗi do khung làm việc gây ra vì một số lý do javascript không mong đợi. Thấy lỗi (bằng cách kiểm tra 'xhr.responseText') sẽ giúp chúng ta biết được vấn đề ở đâu. – CodeThug

2

Tôi đã nhận được các lỗi bí ẩn tương tự trong quá khứ khi sử dụng gói ASP.NET bó trên loại bỏ và bootstrap, đặc biệt là khi bao gồm các phiên bản đã được rút gọn trong một gói.

Nếu bạn đang chạy trong chế độ DEBUG trên máy chủ cục bộ, thì ASP.NET sẽ không khai thác các thư viện javascript.Tuy nhiên, một khi bạn triển khai, có lẽ bạn không còn ở chế độ DEBUG và bây giờ khai thác/gộp các tập lệnh. Đôi khi việc đóng gói/rút gọn các tập lệnh này có thể dẫn đến lỗi cú pháp tương tự như lỗi bạn đã đăng.

Nếu có, bạn có thể tải loại trực tiếp từ CDN để tránh nhu cầu đóng gói.

+0

Ah tôi hiểu rồi. Đây có thể là vấn đề. Tôi đã trả về chỉ một JSON (Error = true) và nó vẫn xảy ra. Vì vậy, tôi đang nghĩ rằng điều này có thể là nó. Tôi sẽ kiểm tra nó. – jmogera

+0

Mặc dù một điều cần lưu ý, tôi không có bất kỳ gói nào kể từ khi tôi là MVC3. Tôi đã sử dụng các công cụ Web Essential để rút gọn một số trong số các js. – jmogera

4

Bạn đang cố trả lại phản hồi 400 (Yêu cầu không hợp lệ) bằng nội dung phản hồi tùy chỉnh của riêng bạn.

Tôi nghĩ rằng IIS theo mặc định không cho phép bạn thực hiện việc này và như CodeThug đã đề cập, có thể thay thế nội dung JSON tùy chỉnh của bạn bằng thông báo máy chủ.

Nhưng có vẻ như bạn có thể ghi đè lên hành vi này:

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

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

Nó dường như JSON gửi như phản hồi từ máy chủ được nặng tạo

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

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

nên giá trị cho bất động sản văn bản được tạo ra kém.

giá trị kiểm tra kép trong máy chủ sản xuất/phát triển cho các giá trị như vậy.

Cách tốt nhất là thay thế dấu ngoặc kép với nhân vật thoát

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