0

jQuery + Ajaxを使用して自家製のvb.net Webサービスを呼び出そうとしていますが、詳細に苦労しています。

Web メソッドとして公開されている小さな関数を次に示します。

<WebMethod()> <ScriptMethod(ResponseFormat:=ResponseFormat.Xml, UseHttpGet:=True)> _
Public Function GetAllVotes() As XmlDocument

    Dim theVotes = getVotes()
    Dim strResult As String = theVotes.XMLSerialize


    Dim doc As XmlDocument = New XmlDocument()
    doc.LoadXml(strResult)
    Return doc

End Function

Web を見た後、XML を返していたので ScriptMethod 属性を追加しましたが、その場合は必要ないことを教えてください。

次に、クライアント側のコードは次のとおりです。

function getVotes() {
$.support.cors = true;

$.ajax({
  type: "GET",
  contentType: "application/json",
  url: "http://nhrd635:8008/votingmanager.asmx/GetAllVotes",
  data: {},
  dataType: "xml text jsonp",
  success: function(msg) {
      // Hide the fake progress indicator graphic.
      // Insert the returned HTML into the <div>.
      $('#myPlaceHolder').html(msg);
    },
   error: function(msg) {
      $('#myPlaceHolder').html(msg);
        // alert(msg);
   }

});
}

私は多くの..このコードの多くのバリエーションを試しました.postまたはgetを使用し、コンテンツタイプを変更し、charset = utf-8の有無にかかわらず。データの二重引用符の有無: {}。

リクエストの出力をトレースするために firebug を使用します。dataType を jsonp に設定した場合にのみ結果が得られますが、すべてのインスタンスで、ステータスが 200 OK であっても、コードは「エラー」関数で終了します。しかし、jsonpに設定すると、xmlが実際のjavascriptとして扱われるため、間違っていることがわかります...

encosia に関する非常に有益なブログ エントリを読んだことがあります。(サンプル: http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/ )

しかし、彼の例に従っても、適切なリターンを得ることができません。

私は非常に明白な何か間違ったことをしていますか? json でシリアル化された文字列ではなく、xml 文字列を返しているということですか?

4

2 に答える 2

0

Stack Overflow をさらに熟読し、Encosia の Dave Ward の助けを借りて、問題を解決することができました。将来誰かに役立つ場合に備えて、ここに最終的な解決策を投稿する必要があると思いました。

まず第一に、Web サービスはそれを行うには悪い方法でした。元の質問への返信で Dave Ward が提案したように、 HttpHandler ソリューションを使用しました。

XML を返すことも適切な選択ではありませんでした。プロジェクトに JSon.net への参照を追加し、それを使用してオブジェクトを Json 文字列に変換しました。

Dave のブログ投稿で示唆されているように、json 文字列に変換するために「.net のみ」に固執したかったのですが、どういうわけか、Dave の例のように .net に自動的に Json に変換するように指示する方法を学ぶのに苦労しました。 Json.net を使用して「機能させる」ための簡単な方法

次に、HttpHandler で、StackOverflow からのこの投稿の指示に従って、応答文字列を作成しました。

https://stackoverflow.com/a/3703221/1060133

私の場合、それは:

context.Response.Write(String.Format("{0}({1});", context.Request("callback"), jsonVotes))

jquery 呼び出しも、上記の投稿の手順を使用しました。

興味深いことに、パラメーターなしの呼び出しであっても、次のように空のデータを送信する必要があります。

$.getJSON('http://url/httpHandler.ashx?callback=?', {}, 
          function(data) {
          alert(data);
          }
); 

幸運を祈ります...

于 2013-01-15T15:37:45.540 に答える
-1

ここでの問題のほとんどは、おそらくクロスオリジンリクエストに起因すると思います(同じマシンカウントの異なるポート間でリクエストを行う場合でも)。そのため、JSONPに切り替えたときに、それが機能していることを垣間見ることができました。残念ながら、ASMXの「ScriptServices」はJSONPをサポートしていないため、WebMethodが返すデータは、jQueryが挿入するJSONPコールバック関数への有効なパラメーターではありません。

可能であれば、最善の解決策は、サービスを呼び出しているページと同じドメインでサービスを実行することです。クロスオリジンの問題にはさまざまな解決策がありますが、リクエストを行うページが存在するのと同じドメインへの単純なXHRリクエストほど広く互換性/信頼性のあるものはありません。

それができない場合は、votingmanager.asmxを提供しているサイトでCORSサポートを有効にすることを検討してください。これはIEのほとんどのバージョンでは機能しませんが、他のブラウザーでクロスオリジンリクエストを許可します。これを行う方法の詳細については、http://encosia.com/using-cors-to-access-asp-net-services-across-domains/をご覧ください。

正直なところ、可能であれば、余分なXMLシリアル化レイヤーは避けたいと思います。getVotes()がListのようなものを返す場合は、それを戻り型として使用し、ASP.NETでコレクションをJSONとして自動的にシリアル化すると、jQueryがそれを成功ハンドラーのJavaScript配列に自動的に変換します。詳細については、http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/をご覧ください。

于 2013-01-11T07:16:08.360 に答える