0

所以,我对创建 Web 服务非常陌生,但我成功地制作了一个简单的 Web 服务,它可以从数据库中返回我需要的信息作为List(Of dictionary(of string, string))对象。

出于测试的目的,我手动创建了它,我的代码如下所示:

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

这个网络服务“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 问题:

Access-Control-Allow-Origin 不允许来源 http://localhost

如何在 asp.net 中实现“Access-Control-Allow-Origin”标头

还有更多,但我找不到符合我标准的绝对解决方案。我想以与上述类似的格式输出数据,并使用 jQuery 从另一个域访问它。

我发现的最简单的解决方法是编写一个在接收服务器上运行的处理页面,只需按照我上面的 VB 代码示例加载数据并webMethod在该服务器上操作以吐出 JSON,但我宁愿整个事情可以由 Web 服务处理,因此无需在消费服务器上运行额外的文件。

编辑; 实际上,我还需要能够执行 POST 操作。

4

0 回答 0