JQueryを使用してASP.net Webサービスにアクセス中にエラーが発生しました-JSONP
-
10-07-2019 - |
質問
以下のコードをご覧になり、Webサービスコードで何が間違っているのかを理解してください。 JSONPを使用して使用できるasp.net Webサービスをセットアップしたい。クライアント側でJqueryを使用してサイトにアクセスしています。適切な属性を設定した後でも、Aynch呼び出しが失敗するため、Webサービスはxmlを送信します。
Webサービス
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
[ScriptMethod(ResponseFormat= ResponseFormat.Json, XmlSerializeString=false, UseHttpGet=true)]
public string HelloWorld(int id, string __callback) {
return __callback + "({message: 'Hello World'})";
}
}
Webサービスの応答:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">test({message: 'Hello World'})</string>
Web.Config:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd"
type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
Javascript
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "http://localhost:54404/jsonp/webservice.asmx/HelloWorld?id=2&__callback=?", //?jsonp=MatchSvcCallback
dataType: "jsonp",
data: {},
//jsonp : "MatchSvcCallback",
success: function(msg) {
alert("Inside success callback function"); // not being called
},
error: function(xhr, msg){
var response = JSON.parse(xhr.responseText);
}
});
jsコードはハンドラーで機能しますが、xml応答のためにWebサービスでは失敗します。
解決
ここでの問題は、 $。ajax()
を使用する場合、jQueryがHTTP GETのHTTP要求で Content-Type
ヘッダーを設定しないためだと思います。要求タイプが「POST」の場合にのみ送信されます。これは、 dataType:&quot; jsonp&quot;
と dataType:&quot; json&quot;
の両方に当てはまるようです。
あなたの例を試し、フィドラーでリクエスト/レスポンスの交換を見ました「 Content-Type:application / xml;」は表示されません。 charset = UTF-8
はHTTP GETリクエストのヘッダーで送信されます。 HTTP POSTを使用している場合、ヘッダーは送信されます。このヘッダーの存在は、ASP.NET Webサービスの配管がJSON形式の応答を返すかXML形式の応答を返すかを決定するための手掛かりだと推測しています。
この問題を抱えているのはあなただけではないようです。エレガントコードWebサイトの次の記事を参照してください。
リモートASP.NET Webの呼び出しJQueryのサービス
解決策は次のいずれかです。
-
HttpModule
を使用して、Content-Type:application / xml;を挿入します。上記の記事で説明したように、リクエストストリームにcharset = UTF-8
ヘッダーを追加します。 -
ASP.NET Webサービスを使用する前に実行していたことを説明したように、エンドポイントに
HttpHandler
を使用します。 -
Rick Strahlのページベースのアプローチを試してください 次の記事(これは とにかく実際には
HttpHandler
です):クロス用のJSONP -site Callbacks 。