为啥从 ajax 调用 web 服务会引发内部服务器 500 错误?
Posted
技术标签:
【中文标题】为啥从 ajax 调用 web 服务会引发内部服务器 500 错误?【英文标题】:Why calling a webservice from ajax throws internal server 500 error?为什么从 ajax 调用 web 服务会引发内部服务器 500 错误? 【发布时间】:2018-01-04 21:50:48 【问题描述】:我使用 ajax $.post 方法将数据发送到我的 .asmx 网络服务,但它会引发内部服务器 500 错误。
.asmx.cs
namespace WebServices
/// <summary>
/// Summary description for himher
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class himher : System.Web.Services.WebService
[WebMethod(EnableSession = true)]
//[ScriptMethod(UseHttpGet = false)]
public string InsertUsers(string name, string pwd)
basicoperation bop = new basicoperation();
return bop.insertUsers(name, pwd);
function save()
$("button").click(function()
$.post("http://localhost:8373/himher.asmx?op=InsertUsers",
name: "testing ajax name",
pwd: "testing ajax pwd"
, function(data, status)
alert(data);
);
);
我收到此错误:
加载资源失败:服务器响应状态为 500(内部服务器错误)
我还为 chrome 添加了一个扩展,例如 Allow-Control-Allow-Origin
。
我花了很多时间在它上面,但它离修复还差得很远。帮我解决这个问题。我是 AJAX 的新手。
是的,我已经测试了 Web 服务,它运行良好,例如将数据发送到 SQL 表。 C# 结束时没有错误。它不会抛出异常。
我尝试在 IIS express 和 windows IIS 上运行它并且都返回相同的错误。帮助。
更新:插入用户
public string insertUsers(string Name, string Password)
string status;
String ConStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
SqlConnection sqlCon = new SqlConnection(ConStr); // to make a connection with DB
SqlCommand sqlCom = new SqlCommand("InsertUsers", sqlCon); // now in order to perform action such as insert SP, we must create command object which needs command name and conncetion only
sqlCom.CommandType = CommandType.StoredProcedure; // you must tell the system that insertInfo is a storedprocedure
SqlParameter sqlParamName = new SqlParameter("@UserName", Name);
SqlParameter sqlParamPwd= new SqlParameter("@Password", Password);
sqlCom.Parameters.Add(sqlParamName);
sqlCom.Parameters.Add(sqlParamPwd);
try
sqlCon.Open();
sqlCom.ExecuteNonQuery(); // executenonquery is used for INSERT, UPDATE, DELETE
//sqlCom.ExecuteScalar(); // used to pick or read a single value from procedure
// Response.Write("Done");
sqlCon.Close();
status= "Success";
catch (Exception ex)
//response.Write(ex.Message);
status = ex.Message;
return status;
堆栈跟踪:
<?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.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>
【问题讨论】:
您是否尝试过在 web 服务中设置断点以查看哪一行代码引发了错误?或者检查控制台以查看错误消息?或者在代码周围放置一个 try/catch 以查看异常是什么?您关于 JS 代码是罪魁祸首的断言是错误的,因为 500 错误消息只会从服务器生成。 错误是服务器端。因此,您拥有的两行之一很可能引发异常。 @RoryMcCrossan:代码绝对没问题。因为我测试了它的运行并使用它将代码插入到我的数据库中,它就像一个魅力 那么 500 是从哪里来的? @RoryMcCrossan 解决了,正如我所说,这是一个 javascript 问题。所以我是对的,是的。 【参考方案1】:解决了。我想通了,这肯定是一个javascript问题。
唯一需要做的就是从 url 中删除 ?,例如
"http://localhost:8373/himher.asmx/InsertUsers",
而不是
"http://localhost:8373/himher.asmx?op=InsertUsers"
【讨论】:
以上是关于为啥从 ajax 调用 web 服务会引发内部服务器 500 错误?的主要内容,如果未能解决你的问题,请参考以下文章
从VB.NET Web表单调用我的第一个WCF服务中的函数会引发错误。函数调用缺少WCF函数中的参数
带有 Web 服务的 HTTP 500 错误 jQuery Ajax
对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败
Laravel 5 App - AJAX 发布请求不接受令牌并引发 500 内部服务器错误