Asmx响应json并通过ajax调用

时间:2016-01-29 16:38:09

标签: json ajax xml jsonp asmx

我有以下问题 我正在尝试使用jquery连接HTML页面和asmx服务。 该服务位于我的本地IIS中,我已将其配置为允许跨域请求: 这是我的服务代码:

[WebService(Namespace = "http://myservices.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class Test : WebService
{   
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Employee TestMethod()
    {
        return new Employee { Id = 1, Name = "John"};
    }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这是我的web.config服务代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
      <webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
        </protocols>
      </webServices>
      <compilation debug="true" targetFramework="4.0" />
    </system.web>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
    <handlers>
      <add name="ScriptHandlerFactory"
           verb="*" path="*.asmx"
           type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
           resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>

因此,我可以使用此URL

从任何地方(不同的域)调用服务方法

http://localhost/WsTest/Test.asmx/TestMethod

但是,响应是xml,为什么? ......我不知道自己需要什么

<Employee xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://myservices.org/">
    <Id>1</Id>
    <Name>John</Name>
</Employee>

这是我的第一个问题。

其次,当我尝试使用带有以下代码的ajax获取服务响应时:

$.ajax({
    url: "http://localhost/WsTest/Test.asmx/TestMethod",
    beforeSend: function () {},
    data: {},
    contentType: "application/json; charset=utf-8",
    type: "POST",
    dataType: "jsonp",
    processData: false,
    cache: false,
    success: function(data) {
        alert(data)
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("Retrieve Failed (AJAX Error): " + jqXHR.statusText + " | " + textStatus + " | " + errorThrown);
    }               
});

我收到以下回复:

TestMethod?callback = jQuery220045970173459500074_1454084649739&amp; [object Object]&amp; _ = 1454084649740:1

未捕获的SyntaxError:意外的标记&lt;

检索失败(AJAX错误):加载| parsererror |错误:未调用jQuery220045970173459500074_1454084649739

我已经阅读了关于这个问题的几个答案,但我找不到适合我的问题的答案。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我认为在将响应发送回客户端之前,您没有正确地序列化响应。

您必须将您的类序列化为Json字符串。为此,请按照以下MSDN链接中提供的说明进行操作:

How to: Serialize and Deserialize JSON Data

然后,您应该更改Web方法以返回String值,并在将响应返回给客户端之前,执行序列化技巧,如下所示:

var objectSerializer = new JavascriptSerializer();
//serialization  
return objectSerializer.Serialize(data); //this will return a Json string

有关JavascriptSerializer类的更多详细信息,请查看以下链接:

JavaScriptSerializer Class

关于您的错误,这是因为您的响应以XML格式(标准SOAP响应)返回,因此您使用的javascript代码期望Json格式。诀窍是简单地返回一个Json字符串。

您拥有的另一个选择是使用WCF而不是ASMX,但这是您可以在此处查看的另一条路径:

How do I return clean JSON from a WCF Service?

请注意暴露您的服务所涉及的安全风险。使用唯一的ID或其他机制来保护您的Web服务调用免受Javascript。