0

我在 ASP.Net 3.5 中有一个 Web 服务,但无法正确生成 JSON。格式正确,但在尝试访问 $ 时仍然不起作用。阿贾克斯。我怀疑标题仍然是 xml,我不明白为什么。以下代码:

网络服务:

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data
Imports System.IO
Imports System.Runtime.Serialization.Json

<System.Runtime.Serialization.DataContractAttribute()> _
Public Class Estado

    Dim _ID As Integer = 0
    <System.Runtime.Serialization.DataMemberAttribute()> _
    Public Property ID() As Integer
        Get
            Return _ID
        End Get
        Set(value As Integer)
            _ID = value
        End Set
    End Property

    Dim _Descricao As String = ""
    <System.Runtime.Serialization.DataMemberAttribute()> _
    Public Property Descricao() As String
        Get
            Return _Descricao
        End Get
        Set(value As String)
            _Descricao = value
        End Set
    End Property

    Dim _UF As String
    <System.Runtime.Serialization.DataMemberAttribute()> _
    Public Property UF() As String
        Get
            Return _UF
        End Get
        Set(value As String)
            _UF = value
        End Set
    End Property

End Class

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function HelloWorld() As String
        Return "Hello World"
    End Function

    <WebMethod()> _
    <Script.Services.ScriptMethod(ResponseFormat:=System.Web.Script.Services.ResponseFormat.Json)> _
    Public Function getStates() As String
        Try
            Dim ds As New System.Data.DataSet

            Dim strConexao As String = ""
            strConexao = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString

            Dim conexao As System.Data.SqlClient.SqlConnection = New Data.SqlClient.SqlConnection()
            conexao.ConnectionString = strConexao
            conexao.Open()

            Dim cmd As System.Data.SqlClient.SqlCommand = New Data.SqlClient.SqlCommand
            cmd.CommandText = "Select ID, Descricao, UF From dbo.States"
            cmd.CommandTimeout = 120
            cmd.Connection = conexao

            Dim adp As System.Data.SqlClient.SqlDataAdapter = New Data.SqlClient.SqlDataAdapter()
            adp.SelectCommand = cmd
            adp.Fill(ds)

            Dim obj As List(Of Estado) = New List(Of Estado)
            For Each dr As DataRow In ds.Tables(0).Rows
                Dim e As Estado = New Estado()
                e.ID = dr.Item("ID")
                e.Descricao = dr.Item("Descricao")
                e.UF = dr.Item("UF")

                obj.Add(e)
            Next

            Dim strRetorno As String = getJSON(obj)


            Return strRetorno
        Catch ex As Exception
            Return "Deu Merda: " + ex.Message
        End Try

    End Function

    Private Function getJSON(obj As Object) As String
        'yourobject is your actual object you want to serialize to json
        Dim serializer As DataContractJsonSerializer = New DataContractJsonSerializer(obj.GetType())

        'create a memory stream
        Dim ms As MemoryStream = New MemoryStream()

        'serialize the object to memory stream
        serializer.WriteObject(ms, obj)

        'convert the serizlized object to string
        Dim jsonString As String = Encoding.Default.GetString(ms.ToArray())

        'close the memory stream
        ms.Close()

        Return jsonString
    End Function
End Class

网页:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WS_JSON_Teste._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>

<link rel="stylesheet" href="http://code.jquery.com/ui/1.8.22/themes/base/jquery-ui.css" type="text/css" media="all" />
<link rel="stylesheet" href="http://static.jquery.com/ui/css/demo-docs-theme/ui.theme.css" type="text/css" media="all" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script src="http://code.jquery.com/ui/1.8.22/jquery-ui.min.js" type="text/javascript"></script>

<script type="text/javascript">
    $(document).ready(function ($) {
        $.ajax({
            type: "POST",
            url: "http://localhost:27916/WS_JSON/Service.asmx/getStates",
            contentType: "application/jsonp; charset=utf-8",
            dataType: "jsonp",
            success: function (data) {
                alert("success!");
            },
            failure: function (error) {
                alert("failure!");
            }
        });
    });

</script>

我用这个链接作为参考。

4

1 回答 1

0

首先... ASMX 是当前运行良好的技术。总是忽略那些说“那是旧的,所以它行不通”的人

其次,您正在自己进行序列化,这就是导致问题的原因。你不必那样做。如果您的请求正确完成,并且服务知道您需要 JSON,您所要做的就是返回该对象,它会为您将其转换为 JSON。

看到这篇文章:http ://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

您的 Web 服务基本上可以看起来像这样:

Public Function getStates() as List(Of Estado)
  Dim myStates as List(Of Estado)

  //do the SQL to create the List object - same as above
  //then just do this!
  return myStates
End

那会容易得多!

如果您在阅读文章后有不明白的地方,请告诉我。如果有帮助,我很乐意添加更多细节。我现在有以这种方式运行的服务,所以我知道它们可以工作,而且它们并没有过时。

于 2013-04-02T21:56:03.507 回答