从 jQuery 调用 ASP.NET ASMX Web 服务
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3506634/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Calling ASP.NET ASMX Web Service from jQuery
提问by Mark Richman
I am trying to call an ASMX from jQuery using JSON and get a SOAP error response.
我正在尝试使用 JSON 从 jQuery 调用 ASMX 并获得 SOAP 错误响应。
What am I doing wrong?!
我究竟做错了什么?!
This is my jQuery call:
这是我的 jQuery 调用:
$.ajax({
type: "POST",
url: '/Services/TeamPerson.asmx',
contentType: "application/json; charset=utf-8",
data: {'active':false, 'team_id':team_id, 'player_id':player_id},
dataType: "json",
success: function(msg) {
alert(msg);
},
error: function(xhr, msg) { alert(msg + '\n' + xhr.responseText); }
});
This is my web service:
这是我的网络服务:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class TeamPerson : WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void SetPlayerStatus(bool active, ulong team_id, ulong player_id)
{
// blah blah
}
}
I get a nasty SOAP error back:
我收到一个讨厌的 SOAP 错误:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body><soap:Fault><soap:Code>
<soap:Value>soap:Receiver</soap:Value></soap:Code>
<soap:Reason><soap:Text xml:lang="en">
System.Web.Services.Protocols.SoapException: Server was unable to process request. --->
System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
at System.Xml.XmlReader.MoveToContent()
at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent()
at System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement()
at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
--- End of inner exception stack trace ---</soap:Text></soap:Reason><soap:Detail /></soap:Fault></soap:Body></soap:Envelope>
I can hit /Services/TeamPerson.asmx
via my browser and the web method works fine. I also have the following defined in web.config:
我可以/Services/TeamPerson.asmx
通过我的浏览器点击并且网络方法工作正常。我还在 web.config 中定义了以下内容:
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
<add verb="GET,HEAD,POST" path="TinyMCEHandler.aspx" type="Moxiecode.TinyMCE.Web.HttpHandler,Moxiecode.TinyMCE" />
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
回答by DaveB
You are not defining which method to call on the service. Try changing your JQuery line url: '/Services/TeamPerson.asmx',
to url: '/Services/TeamPerson.asmx/SetPlayerStatus',
您没有定义在服务上调用哪个方法。尝试将您的 JQuery 行更改url: '/Services/TeamPerson.asmx',
为url: '/Services/TeamPerson.asmx/SetPlayerStatus',
回答by p.campbell
Perhaps it's the web method missing in the URL, as well as the parameters.
也许是 URL 中缺少 web 方法,以及参数。
var teamID = 123;
var playerID = 456;
var active = true;
var webMethod = 'http://foo.net/TeamPerson.asmx/SetPlayerStatus'
var parameters = "{'active':'" + active +
"','team_id':'" + teamID +
"','player_id':'" + playerID + "'}"
$.ajax({
type: "POST",
url: webMethod,
data: parameters,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert('all good');
},
error: function(e){
alert('err');
}
});