2012-01-28 14 views
0

を取得するために、内部サーバーエラー(500)で応答:ASP.NETのWebサービスは、投稿し、Webサービスのコードがシンプルである要求

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public void receiveOrder(string json) { 
    Context.Response.Write("ok"); 
} 

、次のようにWebサービスを呼び出しjqueryのは、次のとおりです。

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: 'http://localhost:50730/GingerWeb.asmx/receiveOrder', 
    data: 'test', //JSON.stringify(webOrder), 
    dataType: "text", 
    success: function(data){ 
     if(data === "ok") 
      orderPlaced(); 
     } 
}); 

そして、まだクロームコンソールは、挑発的な赤で読み取ります

500(内部サーバーエラー)

+0

dataTypeを "json"にしないでください。 –

+0

私はそれを理解しました。将来の調査者のために、asmxページを呼び出したときに表示される組み込みのページは、webserviceに(この場合は)jsonを要素の1つとして持つ特別な形式のxmlテキストが必要であることを示しています。 – lowerkey

答えて

1

問題は、ASMX Webサービスが、すべての入力パラメータを要求で見つける必要があることです。サーバーへの要求で少なくとも1つの入力パラメーターが見つからない場合、Webサービスは状態コード500(内部サーバーエラー)で失敗しました。

理由は間違った方法でデータを送信するためです。 Webメソッドの入力パラメータの名前はjsonです(void receiveOrder(string json)参照)。あなたが前に試してみましたtype: "POST"の代わりdata: JSON.stringify(webOrder)を使用するのであれば$.ajaxdataオプションは、フォーム

data: JSON.stringify({json: webOrder}) 

にする必要があります。 POSTリクエストの本文の場合、theValueの代わりにjson=theVlueになります。

あなたがdataパラメータのフォーマットは「JSON」でなければなりません

data: {json: JSON.stringify(webOrder)} 

dataTypeの値に変更する必要がありますtype: "GET"を使用したい場合。変更後、$.ajaxが動作するはずです。

また、urlオプションで相対パスを使用することをお勧めします。 'http://localhost:50730/GingerWeb.asmx/receiveOrder'の代わりに'/GingerWeb.asmx/receiveOrder'を使用します。それはsame origin policyのエラーからあなたを救うでしょう。

0

こんにちはオレグ:あなたの説明は簡単でポイントです。私はあなたの説明が解決した同様の問題を抱えていました。私は、「検索者」が私が直面していたことと上記の解決方法を理解するのに役立つコードスニペットを提供しています。要するに、aspxページから簡単なjquery(.ajax)を発行しています。バックエンド(キャッシュ/ db)からいくつかのデータを取得し、json形式で同じ結果を返すWebサービスを作成しました。

JSコード:

var parameters = "{'pageName':'" + sPage + "'}" 
var request = $.ajax({ 
    type: "POST", 
    url: "/NotificationWebService.asmx/GetNotification", 
    data: parameters, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

ASP.NETコードの背後にWebサービスのための

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string GetNotification(string pageName) 
{ 
    JavaScriptSerializer js = new JavaScriptSerializer(); 
    Notification ns = NotificationCache.GetActiveNotificationForPage(pageName); 
    if (ns != null) 
    { 
     NotificationJSData nJSData = new NotificationJSData(); 
     nJSData.Code = ns.Code; 
     nJSData.displayFreq = (short)ns.DisplayFreq; 
     nJSData.expiryDate = ns.ToDateStr; 

     return js.Serialize(nJSData); 
    } 
    return null;  
} 

あなたが何を使用したWebサービスコードで指定した「ページ名」変数名と一致していることを確認することが絶対に必要ですajaxリクエストのデータパラメータで送信されます。私はそれらを違うものにして、それを同じものに変えました。時間を費やして、ついにこの記事のおかげで正しい解決策を見つけました。また、私の場合、単一の "name:value"ペアを渡すだけなので、値を取得するためにjsonデ直列化関数を使用する必要もなく、上記のpageNameは私に値を与えます。

関連する問題