为啥从 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. ---&gt; 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&amp; 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 内部服务器错误

扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常

使用 jquery ajax jsonp 调用 web 服务:错误