したがって、私はWebサービスの作成に非常に慣れていませんが、データベースから必要な情報をList(Of dictionary(of string, string))
オブジェクトとして返す単純なWebサービスを作成することに成功しました。
テストの目的で、これを手動で作成しました。コードは次のようになります。
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Web.Script.Serialization
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class test
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function dic() As String
Dim newDic As New List(Of Dictionary(Of String, String))
Dim one As New Dictionary(Of String, String)
one.Add("id", "1")
one.Add("name", "the name")
one.Add("price", "5.99")
newDic.Add(one)
Dim two As New Dictionary(Of String, String)
two.Add("id", "2")
two.Add("name", "item name two")
two.Add("price", "1299")
newDic.Add(two)
Dim s As New JavaScriptSerializer
Dim str As String = s.Serialize(newDic)
Return str
End Function
End Class
この Web サービス「dic」は、次のようなシリアル化された文字列/リストを提供します。
[{"id":"1","name":"the name","price":"5.99"},{"id":"2","name":"item name two","price":"1299"}]
これは、次のような VB コードで読み取ることができます。
Sub loadMe() Handles Me.Load
Dim t As New websvce.testSoapClient
Dim d As String = t.dic
Dim s As New JavaScriptSerializer
Dim d2 = s.DeserializeObject(d)
Response.Write(d2(1)("name") & "<hr>")
End Sub
これにより、インデックス「1」の「name」要素の出力が得られます。それは正常に動作します。
ただし、当然のことながら、次のコードを使用して jQuery でこの情報を取得しようとすると機能しません。
$(document).ready(function () {
$.getJSON('URL/test.asmx/dic', function (data) {
alert(data);
});
});
だから私は一日のかなりの部分をこれをグーグルで過ごし、クロスドメインスクリプティングが許可されていない理由と、プロキシを使用してそれを回避する方法があること、ページにヘッダーを追加することなどについて教えてくれるあらゆる種類のコメントと会話を見つけました.. .しかし...問題の決定的な解決策はありません。
私が見つけたSOの質問のいくつかを次に示します。
オリジン http://localhost は Access-Control-Allow-Origin で許可されていません
asp.net で「Access-Control-Allow-Origin」ヘッダーを実装する方法
他にもたくさんありますが、私の基準に合う絶対的な解決策は見つかりません。上記のような形式でデータを出力し、jQueryで別ドメインからアクセスしたい。
私が見つけた最も簡単な回避策は、受信サーバーで実行される処理ページを作成することです。上記の VB コードの例に従ってデータをロードし、webMethod
そのサーバー上で として動作して JSON を吐き出します。 Web サービスによって処理される可能性があるため、消費サーバーで追加のファイルを実行する必要はありません。
編集; 実際には、POST 操作を実行できる必要もあります。