2013-04-17 12 views
5

私はいくつかのajax投稿を作成していますが、ローカルホストでうまくいくようですが、amazonでec2サーバーに公開するとUncaught SyntaxError:Unexpected token B. JSONの解析に失敗したようです。同じデータベース、同じブラウザ、同じメソッドが呼び出されています。なぜローカルで動作し、サーバー上で動作しないのでしょうか?ここでキャッチされていないSyntaxError:ローカルサーバーではなく予期しないトークンB

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

は、サーバー側の基本的なレイアウトです:文を試す

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

     } 

、私は(データベースへのクエリのカップルを行うと、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<string> errors = new List<string>(); 
    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)

+0

これは、サーバーの問題のように聞こえると引用符を置き換えるです。 @ Url.Action( "Action")の背後にあるサーバーサイドのコードを共有できますか? – CodeThug

+0

@ CodeThugサーバーのサイドコードを追加しました。 – jmogera

+0

@CodeThug任意のアイデア。助けてください! – jmogera

答えて

5

はあなたがcan't find action only on live server, works fine in local serverで別のポストを持っているので、私は、この記事が具体的にjavascriptの部分に関連していることではない推測していますサーバー側の部分。

サーバー上で何か問題が起きたようですが、サーバーは何らかのエラーを送信し、エラーハンドラ(javascript内)はその応答を処理しようとすると死んでしまいます。

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

非常に妥当と思われます。コードを見てみましょう:

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

は、私は非常にxhr.responseTextが何であるかを見てみることをお勧めします。私はそれが有効なJSONを含んでいないと思うので、parseJSONメソッドは '予期しないトークンB'エラーをスローします。

この値を見るには、console.log(xhr.responseText);と入力するか、Webブラウザーまたはフィドラーでjavascriptデバッガーのようなツールを使用して、そこにあるものを確認することができます。

私の推測によれば、サーバは期待通りに、JSONの代わりにThere was an error on the serverのような文字列を送り返していると思います。私はエラー処理が組み込まれていることがわかります - 私の推測では、エラー処理内にエラーがあり、それをキャッチするものはありません。サーバー側でデバッグを行い、予期しないエラーがあるかどうかを確認することをお勧めします。

おそらくprofile.messagesは一度しか列挙できないもので、もう一度やり直そうとするとエラーになります。または、何らかの理由でDB.SaveChangesがエラーをスローしている可能性があります。いずれの場合も、クライアント側で表示される動作で表示されるログメッセージが表示されます。

+0

例外は$ .parseJSONで発生しています。エラーを返すだけのテストアクションを作成しました。サーバー側の計算はありません。 – jmogera

+0

xhr.responseTextの値は何ですか?それが状況に光を加えるべきであることを見ている。 – CodeThug

+0

テストアクションはサーバー側の計算を行いませんが、MVCなどのサーバー側のフレームワークによって計算が行われる可能性が高く、 'xhr.responseText'には何らかの理由でフレームワークによってスローされるエラーが含まれている可能性がありますそれはJavaScriptが期待していないことです。エラーを見て( 'xhr.responseText'を調べることによって)、どこに問題があるかを知るのに役立ちます。 – CodeThug

2

ノックアウトとブートストラップでASP.NETスクリプトバンドルを使用しているとき、特にバンドルに既に圧縮されたバージョンを含めるときに、これまで似た不思議なエラーが発生しました。

localhostでDEBUGモードで実行している場合、ASP.NETはjavascriptライブラリを縮小しません。しかし、いったんデプロイすると、あなたはおそらくDEBUGモードになっておらず、現在はスクリプトを縮小/バンドルしています。場合によっては、これらのスクリプトをバンドル/縮小すると、投稿したスクリプトに似た構文エラーが発生することがあります。

もしそうなら、CDNからノックアウトを読み込んでバンドルする必要がなくなることがあります。

+0

ああ、私は参照してください。これは問題かもしれません。私はJSON(エラー=真)だけを返して、それがまだ発生します。だから私はこれがそうかもしれないと思うように導いています。私はそれをテストします。 – jmogera

+0

私はMVC3であるので、注意するべきことは1つありますが、私はバンドルしていません。私は、Web Essentialのツールを使用して、いくつかのjを縮小しました。 – jmogera

4

独自のカスタム応答コンテンツで400応答(不良要求)を返そうとしています。

私は、デフォルトでIISがこれを行うことを許可しておらず、CodeThugが述べたように、カスタムJSONコンテンツをサーバーメッセージに置き換えている可能性があります。

しかし、あなたがこの動作を無効にすることができますことが表示されます:

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

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

それは、サーバからの応答がひどく

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

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

プロパティのように値を生成してJSONを送信するようですテキストがひどく生成されます。

このような値については、本番環境/開発サーバーでの二重チェック値。

のベストプラクティスは、エスケープ文字

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