2009-03-11 13 views
2

以下のコードを見て、私のWebサービスコードで何が間違っているのか理解してください。私は、JSONPを使用して消費できるasp.net Webサービスを設定したいと思います。私はサイトにアクセスするためにクライアント側でJqueryを使用しています。適切な属性を設定した後でも、私のWebサービスはxmlを出しているので、aynch呼び出しが失敗します。JQueryを使用してASP.net Webサービスにアクセスする際にエラーが発生しました - JSONP

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サービスで失敗します。

答えて

5

$.ajax()を使用している場合、jQueryがHTTP GETのHTTP要求でContent-Typeヘッダーを設定していないためです。要求タイプが 'POST'の場合にのみ送信されます。これはdataType: "jsonp"dataType: "json"の両方に当てはまります。

私はあなたの例を試してみて、Fiddlerでリクエスト/レスポンスの交換を見ましたが、HTTP GETリクエストのヘッダーにはContent-Type: application/xml; charset=UTF-8が送信されていません。 HTTP POSTを使用している場合、ヘッダーが送信されます。私はこのヘッダーの存在を推測しているのは、ASP.NET Webサービスの配管がJSONまたはXML形式の応答を返すかどうかを判断する手がかりです。

エレガントなコードのウェブサイト上で次の記事を参照してください、あなたはこの問題に一つだけじゃないようだ:

Calling Remote ASP.NET Web Services from JQuery

ソリューションは、以下のいずれかのように表示されます。

  • HttpModuleを使用して、上記の記事の説明に従ってContent-Type: application/xml; charset=UTF-8ヘッダーをリクエストストリームに挿入します。

  • ASP.NET Webサービスを使用する前に説明したように、エンドポイントにはHttpHandlerを使用してください。

  • てみてください( がHttpHandlerとにかく有効になっている)次の記事でリックシュトラールのページベースのアプローチ :JSONP for cross-site Callbacks

+0

$ .ajaxのbeforeSentメソッドでコンテンツタイプの問題を修正し、リクエストヘッダを適切に追加されたFirebugでチェックしました。 –

+0

私はjqueryから "無効なラベル"エラーを解決するために応答にコールバックメソッド名が追加されるようにレスポンスを変更するWebサービス拡張を追加する必要があると思います –

関連する問題