6

だから私はいくつかの ajax 投稿を作成しており、localhost では正常に動作しているようですが、Amazon の ec2 サーバーに公開すると、Uncaught SyntaxError: Unexpected token 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("<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);
            }

        }

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

完了同期)

4

4 に答える 4

6

can't find action only on live server, works fine in local serverに別の投稿があるので、この投稿はサーバー側の部分ではなく、JavaScript の部分に特に関連していると思います。

サーバーで何か問題が発生し、サーバーが何らかのエラーを返し、その応答を処理しようとするとエラーハンドラー (JavaScript) が停止するようです。

Uncaught SyntaxError: Unexpected token B が表示されます。これは、JSON 解析の失敗を示しているようです。

それはかなり合理的に聞こえます。コードを見てみましょう:

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

どんなものか見てみることを強くお勧めしますxhr.responseText。私の推測では、有効な JSON が含まれていないため、parseJSON メソッドは「予期しないトークン B」エラーをスローします。

この値を確認するconsole.log(xhr.responseText);には、Web ブラウザーまたはフィドラーで JavaScript デバッガーなどのツールを使用するか、そこに何があるかを確認します。

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

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

于 2013-04-25T02:21:59.253 に答える
5

独自のカスタム レスポンス コンテンツで 400 レスポンス (Bad Request) を返そうとしています。

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

ただし、この動作をオーバーライドできるようです。

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

<system.webServer>
    <httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>
于 2013-04-29T03:25:32.150 に答える
2

過去に、ノックアウトとブートストラップで ASP.NET スクリプト バンドルを使用しているときに、特に既に縮小されたバージョンをバンドルに含めるときに、同様の不可解なエラーを受け取りました。

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

その場合、CDN からノックアウトをロードして、バンドルの必要性を回避できる場合があります。

于 2013-04-27T06:34:35.190 に答える
0

サーバーからの応答がうまく生成されていないため、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"
于 2013-07-08T18:39:51.200 に答える