我有以下问题 我正在尝试使用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
我已经阅读了关于这个问题的几个答案,但我找不到适合我的问题的答案。
提前致谢!
答案 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类的更多详细信息,请查看以下链接:
关于您的错误,这是因为您的响应以XML格式(标准SOAP响应)返回,因此您使用的javascript代码期望Json格式。诀窍是简单地返回一个Json字符串。
您拥有的另一个选择是使用WCF而不是ASMX,但这是您可以在此处查看的另一条路径:
How do I return clean JSON from a WCF Service?
请注意暴露您的服务所涉及的安全风险。使用唯一的ID或其他机制来保护您的Web服务调用免受Javascript。