2013-01-31 90 views
0

我在ASP.Net 3.5中有一個Web服務,我無法正確生成JSON。 格式正確,但在嘗試訪問$時仍不起作用。阿賈克斯。我的懷疑是,標題仍然是XML,我不明白爲什麼。 下面的代碼:Asp.net 3.5和JSON中的Web服務

Web服務:

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> 

我用這個link作爲參考。

+0

ASMX是一項傳統技術,不應該用於新開發。 WCF應該用於Web服務客戶端和服務器的所有新開發。一個暗示:微軟已經在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 –

+0

你的Ajax是否失敗或是數據以字符串形式返回? –

回答

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 

這會容易得多!

讓我知道在閱讀文章後有什麼不明白的地方。如果能提供幫助,我很樂意添加更多細節。我現在有這樣的服務,所以我知道他們工作,而且他們沒有過時。