所以我有一些问题。问题的目标是,当我尝试使用Ajax从用户控件调用Web服务时,我得到了500个内部服务器错误。
有我的代码示例:
网络服务.CS
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class BudgetJson : System.Web.Services.WebService {
public BudgetJson ()
{
}
[WebMethod]
public static String GetRecordJson()
{
return " Hello Master, I'm Json Data ";
}
}
用户控制(.Ascx)文件(Ajax调用)
$(document).ready(function () {
$.ajax({
type: "POST",
url: "BudgetJson.asmx",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg)
{
alert(msg);
}
});
});
因此,当发送页面加载和请求时,我得到了这样的响应:
soap:ReceiverSystem.Web.Services.Protocols.SoapException:服务器是 无法处理请求。 ---> System.Xml.XmlException:数据在 根级别无效。第1行,第1位 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() 在System.Xml.XmlReader.MoveToContent()处 System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent() 在 System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement() 在 System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest() 在 System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage 消息) System.Web.Services.Protocols.SoapServerProtocol.Initialize()at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext上下文,HttpRequest请求,HttpResponse响应) System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext上下文,HttpRequest请求,HttpResponse响应, 布尔和放大器; abortProcessing)---内部异常堆栈的结束 追踪---
如果我将方法名称添加到url,我收到了这样的错误:
未知的网络方法GetRecordJson。参数名称:methodName 描述:执行期间发生未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.ArgumentException:未知的Web方法 GetRecordJson。参数名称:methodName
任何解决方案?
答案 0 :(得分:2)
服务器端的一些事情:
该方法不应该是静态的。这只是ASPX页面上“页面方法”的情况。
其次,您需要使用[ScriptService]
属性来装饰服务类,以便能够在JSON中与它进行通信,我假设您可能希望这样做,因为您正在使用jQuery。
[ScriptService]
public class BudgetJson : System.Web.Services.WebService {
[WebMethod]
public String GetRecordJson()
{
return " Hello Master, I'm Json Data ";
}
}
在客户端,您需要在$.ajax()
网址中指定要执行的方法:
$.ajax({
type: "POST",
url: "BudgetJson.asmx/GetRecordJson",
data: "{}",
// The charset and dataType aren't necessary.
contentType: "application/json",
success: function (msg) {
alert(msg);
}
});
您还可以简化$.ajax()
使用情况,如上所示。从服务器发回的标题中的charset isn't necessary and jQuery automatically detects the dataType。