2

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

ウェブサービス

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

4

1 に答える 1

5

Content-Typeここでの問題は、使用時に jQuery が HTTP GET の HTTP リクエストにヘッダーを設定しないためだと思います$.ajax()。リクエスト タイプが「POST」の場合にのみ送信されます。これは と の両方に当てはまるようdataType: "jsonp"ですdataType: "json"

私はあなたの例を試し、 Fiddlerでの要求/応答交換を監視しContent-Type: application/xml; charset=UTF-8ましたが、HTTP GET 要求のヘッダーで送信されていることがわかりません。HTTP POST を使用している場合、ヘッダーは送信されます。このヘッダーの存在は、ASP.NET Web サービスの配管が JSON または XML 形式の応答を返すかどうかを決定する手がかりになると思います。

この問題を抱えているのはあなただけではないようです。エレガント コード Web サイトの次の記事を参照してください。

JQuery からのリモート ASP.NET Web サービスの呼び出し

解決策は次のいずれかのようです。

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

  • HttpHandlerASP.NET Web サービスを使用する前に行っていたことを説明したように、エンドポイントにaを使用します。

  • 次の記事で、Rick Strahl のページ ベースのアプローチを試してください (これはHttpHandlerとにかく有効です): JSONP for cross-site Callbacks

于 2009-03-11T19:19:16.507 に答える