【问题标题】:Getting a 500 internet server error收到 500 Internet 服务器错误
【发布时间】:2013-06-28 11:41:27
【问题描述】:

我有 2 个内部网站:

http://intranetv1/
http://intranetv2/

v1 基于 .NET 1.1,v2 基于 .NET 3.5

在 v1 上,我创建了一个网页,我正在尝试使用一些 jQuery 来访问我在 v2 上创建的 web 服务。由于 Web 服务是使用 .NET 3.5 编码的,因此我无法在 v1 上使用该 Web 服务。

无论如何,我假设我应该在这种情况下使用 JSONP,但是每次我运行页面时,ajax 部分都不起作用,在谷歌浏览器中,我只会收到 500 错误消息,如取消。

我不知道为什么会这样。

这是 v1 .NET 1.1 服务器上的 jQuery:

function selectedDateTime(strDate, strHours, strMinutes) {

    $.ajax({
        type: 'POST',
        url: 'http://intranetv2/webservices/meetingrooms.asmx/GetDayCount',
        data: '{ strMeetingDate:"' + strDate + " " + strHours + ":" + strMinutes + ":00" + '" }',
        contentType: 'application/json; charset=utf-8',
        dataType: 'jsonp',
        success: function(department) {
            alert("success");
        },
        error: function(xhr, status, error) {
            alert("error");
        }
    });

    return strDate + "---" + $("#txtDate").val();

}

如您所见,我正在尝试访问 v2 .NET 3.5 服务器上的 .asmx 文件。

当我运行它时,谷歌浏览器给我一个 500 服务器错误并说 asmx 文件已被取消,然后我收到一个警报,在 selectedDateTime 函数结束时显示日期警报。所以函数正在执行,但是ajax脚本的成功或错误部分根本没有被执行。


我收到以下回复:

Request URL:http://intranetv2/webservices/meetingrooms.asmx/GetDayCount?callback=jQuery110100248512071557343_1372419413424&{%20strMeetingDate:%2228/06/2013%2006:00:00%22%20}&_=1372419413425
Request Method:GET
Status Code:500 Internal Server Error

Request Headers
GET /webservices/meetingrooms.asmx/GetDayCount?callback=jQuery110100248512071557343_1372419413424&{%20strMeetingDate:%2228/06/2013%2006:00:00%22%20}&_=1372419413425 HTTP/1.1
Host: intranetv3
Connection: keep-alive
Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAABIAEgBIAAAABgAGAFoAAAAWABYAYAAAAAAAAACmAAAABYKIogUBKAoAAAAPQgBQAEMATwBMAEwASQBOAFMAaQB4AGYASQBYAEYALQBHAEIASgBUAEIAMgBKAJBkNIpqc7C+AAAAAAAAAAAAAAAAAAAAAIGOnhAoLt95s2HzXVTV7AvYOt1c9vbdJQ==
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
DNT: 1
Referer: http://intranetv1/meeting/meeting_room_bookings_2_1.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Query String Parametersview sourceview URL encoded
callback:jQuery110100248512071557343_1372419413424
{ strMeetingDate:"28/06/2013 06:00:00" }:
_:1372419413425

Response Headers
HTTP/1.1 500 Internal Server Error
Date: Fri, 28 Jun 2013 11:36:57 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 406

这是我在 Google Chrome 开发人员工具中收到的错误消息的屏幕截图: Click here for full resolution.


这是 .asmx 代码:

[WebMethod()]
public double GetDayCount(string strMeetingDate)
{
    string[] strDateAndTime = strMeetingDate.Split(' ');

    string[] strStartDateParts = strDateAndTime[0].Split('/');
    string[] srtStartTimeParts = strDateAndTime[1].Split(':');

    int year = Int32.Parse(strStartDateParts[2]);
    int month = Int32.Parse(strStartDateParts[1]);
    int day = Int32.Parse(strStartDateParts[0]);
    int hour = Int32.Parse(srtStartTimeParts[0]);
    int min = Int32.Parse(srtStartTimeParts[1]);
    int sec = Int32.Parse(srtStartTimeParts[2]);

    DateTime meetingDate = new DateTime(year, month, day, hour, min, sec);

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {

        using (command = new SqlCommand("intranet.dbo.BusinessHours", connection))
        {

            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@meeting_date", SqlDbType.DateTime).Value = meetingDate;

            connection.Open();

            using (reader = command.ExecuteReader())
            {
                reader.Read();
                return (double)reader["hours"];
            }
        }
    }

【问题讨论】:

  • "As the webservices is coded using .NET 3.5, I can't have that webservices on v1." - 该陈述不正确。无论如何,500 错误表明服务器上出现了一些客户端不可见的错误。你在服务器上的错误处理告诉你什么? Web 服务中是否引发了任何异常?响应正文中是否有任何类型的错误消息返回? (您可能需要使用浏览器调试工具才能看到它。)另外,什么是“日期警报”? selectedDateTime() 返回一个包含日期的字符串值,但它会在任何 AJAX 调用返回任何内容之前执行此操作。
  • 添加了上面的响应头。警报只是客户端的事情,以查看是否实际到达了客户端脚本,并且确实如此。因为它显示日期。
  • 是否有响应正文与标头一起使用?该正文是否包含错误消息?即使没有,服务器端错误处理说明了什么?请求是否在失败之前进入您的代码? 500 错误意味着服务器上出现了问题,因此可以找到最相关的诊断信息。至于有问题的警报,总是会到达,因为它发生在 AJAX 调用完成之前。所以“看看是否真的到达了客户端脚本”并没有多大意义,它告诉你的只是 JavaScript 可以工作。
  • 我会在服务器的哪个位置查看?我正在使用 IIS6。
  • 查看事件日志了解更多详情。

标签: .net jquery .net-3.5 asmx


【解决方案1】:

您的strDate 包含一些无效字符。因此,您需要在通过 ajax 请求发送之前对 strDate 值进行编码。

更新 将您的网络方法标记为ScriptMethod,如下所示

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public double GetDayCount(string strMeetingDate){}

阅读本文了解更多信息

http://tutorials.cmsnsoftware.com/2011/01/how-to-call-csharp-function-in-ajax.html

【讨论】:

  • 没有错误:Windows 开始 > 我的电脑 > 右键单击​​ > 管理 > 事件查看器 > 应用程序。
  • 试试这个data: '{ strMeetingDate:"' + strHours + ":" + strMinutes + ":00" + '" }'
  • 您可以随时在服务上放置一个断点,看看发生了什么
  • 仅此教程参考就值得 +1
【解决方案2】:

删除评论

// [System.Web.Script.Services.ScriptService]

asmx.cs 页面中的这一行

喜欢

 [System.Web.Script.Services.ScriptService]

【讨论】:

  • 这不是一个项目,它是一个单独的 .asmx 文件。我还能添加服务参考吗?
  • 在 asmx.cs 文件中取消注释这一行 => [System.Web.Script.Services.ScriptService]
【解决方案3】:

显然我不能使用 JSON-P 加上 POST...

不可能对另一个服务进行异步 POST 域,由于同源的(相当明智的)限制 政策。 JSON-P 之所以有效,是因为您可以插入 标签到 DOM 中,它们可以指向任何地方。

Post data to JsonP

【讨论】:

  • 如果您控制两个域,使用相同的基本域设置它们可能会更容易。如 intraanetv1.mysite.com 和 intranetv35.mysite.com。然后你可以设置document.domain,你应该很高兴。
  • @oshirowanen,我不认为这是一个可以接受的“答案”,尽管它肯定是相关的。如果将请求方法(即 $.ajax 属性)更改为“GET”有效,那么这应该是您的答案。
【解决方案4】:

您应该将 ajax 发回您自己网站中的某个页面,然后向您希望从中获取数据的任何域或服务发出请求。 您会在 chrome 中看到 500 错误,因为 Web 服务代码中存在错误。

【讨论】:

    【解决方案5】:

    问题可能出在日期格式上。

    在拨打电话之前尝试将其更改为 mm/dd/yyyy HH:MM:ss 而不是 dd/mm/yyyy HH:MM:ss

    【讨论】:

    • 我已经从客户端输入的dd/mm/yyyy HH:MM:ss更改为.asmx文件中的yyyy/mm/dd HH:MM:ss
    • 我已通过将显示数据转换的 .asmx 代码添加到问题底部来更新问题。
    • 好的,就在您的请求标头中,它是这样创建的:{ strMeetingDate:"28/06/2013 06:00:00" }: 即 dd/mm/yyy HH:MM:ss
    【解决方案6】:

    您忘记输入 localhost 或您服务器的任何 ip。

    http://localhost/intranetv2/webservices/meetingrooms.asmx/GetDayCount

    在您用于 web 服务调用的 url 中

    所以替换为

    http://localhost/intranetv2/webservices/meetingrooms.asmx/GetDayCount
    

    替换你的函数

    function selectedDateTime(strDate, strHours, strMinutes) {
    
        $.ajax({
            type: 'POST',
            url: 'http://localhost/intranetv2/webservices/meetingrooms.asmx/GetDayCount',
            data: '{ strMeetingDate:"' + strDate + " " + strHours + ":" + strMinutes + ":00" + '" }',
            contentType: 'application/json; charset=utf-8',
            dataType: 'jsonp',
            success: function(department) {
                alert("success");
            },
            error: function(xhr, status, error) {
                alert("error");
            }
        });
    
        return strDate + "---" + $("#txtDate").val();
    
    }
    

    【讨论】:

    • 我不需要本地主机,因为我可以在浏览器中输入http://intranetv1http://intranetv2 访问内网主页。
    【解决方案7】:

    尝试在 system.web

    的 web.config 中添加以下内容
      <webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
        </protocols>
      </webServices>
    

    另外,如果您遇到缺少参数的错误,请尝试将您的数据更改为:

    data: "strMeetingDate=" + strDate + " " + strHours + ":" + strMinutes + ":00",
    

    让我知道这是否有效。

    【讨论】:

      【解决方案8】:

      可能存在跨域问题。将crossdomain.xml和clientaccesspolicy.xml文件添加到虚拟目录/网站文件夹中。

      crossdomain.xml的代码

        <?xml version="1.0"?>
        <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
        <cross-domain-policy>
        <allow-http-request-headers-from domain="*" headers="SOAPAction,Content-Type"/>
        </cross-domain-policy>
      

      clientaccesspolicy.xml的代码

      <?xml version="1.0" encoding="utf-8"?>
      <access-policy>
       <cross-domain-access>
        <policy>
         <allow-from http-request-headers="SOAPAction">
           <domain uri="*"/>
         </allow-from>
         <grant-to>
           <resource path="/" include-subpaths="true"/>
         </grant-to>
       </policy>
       </cross-domain-access>
      </access-policy>
      

      您也可以从http://msdn.microsoft.com/en-us/library/cc197955%28v=vs.95%29.aspx下载这些文件

      编辑 仔细查看您的代码后,我发现问题在于传递日期字符串。

      根据您的代码输出将是

      '{ strMeetingDate:"07/01/2013 17:10:00" }'

      而您需要生成如下日期字符串值

      '{ "strMeetingDate":"07012013 17:10:00" }' 要么 '{ strMeetingDate:07012013 17:10:00 }'

      也就是说 strMeetingDate 属性应该是字符串类型。

      这个可以在看到asmx服务的帮助的时候看到。它提供了我们在 WCF 服务中的帮助。

      【讨论】:

      • 你能把数据类型从jsonp改成json,然后把这些xml文件加进去吗?
      • jsonp 更改为json,我现在收到403 forbidden 消息。哪个服务器获取 .xml 文件? v1 还是 v2?
      • 将其放置在托管服务的位置。这将使从其他网站(或其他域)调用的服务
      • 将文件复制到包含 .asmx 文件的同一服务器/目录,我仍然收到 403 禁止消息。
      • 在将代码编辑为以下格式数据后尝试:'{ "strMeetingDate":"' + strDate + " " + strHours + ":" + strMinutes + ":00" + '" }'。即引号之间的 strMeetingDate
      【解决方案9】:

      如果您控制这两个域,使用相同的基本域设置它们可能会更容易。如 intraanetv1.mysite.com 和 intranetv35.mysite.com。然后可以设置document.domain = mysite.com,放宽同源策略。

      【讨论】:

        【解决方案10】:

        如果您控制这两个域,使用相同的基本域设置它们可能会更容易。像 intraanetv1.mysite.com 和 intranetv35.mysite.com。然后可以设置document.domain = mysite.com,放宽同源策略。

        另一个选项是跨域资源共享或 CORS。这是一篇关于它的文章:http://www.adobe.com/devnet/html5/articles/understanding-cross-origin-resource-sharing-cors.html

        【讨论】:

          【解决方案11】:

          使用(配置和实施)CORS,并将您的内容作为“应用程序/xml”发送

          随着跨域资源共享 (CORS) 的出现 规范,现在是 W3C 推荐的候选者,Web 应用程序 开发人员有一个浏览器支持的机制来生成 XmlHttpRequests 以安全的方式转移到另一个域。

          http://techblog.constantcontact.com/software-development/using-cors-for-cross-domain-ajax-requests/

          评论:CORS 支持客户端(浏览器/用户代理) http://enable-cors.org/client.html

          评论:CORS 支持 SERVER http://enable-cors.org/server.html

          【讨论】:

            猜你喜欢
            • 2017-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-17
            • 1970-01-01
            • 2018-11-03
            相关资源
            最近更新 更多