获得500内部服务器错误

时间:2013-06-28 11:41:27

标签: .net jquery .net-3.5 asmx

我有两个内部网站点:

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

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

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

无论如何,我认为我应该在这种情况下使用JSONP,但每次我运行页面时,ajax部分都不起作用,而在google chrome中,我只收到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开发者工具中收到的错误消息的屏幕截图: enter image description here 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"];
            }
        }
    }

11 个答案:

答案 0 :(得分:2)

您的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

答案 1 :(得分:1)

中删除评论
// [System.Web.Script.Services.ScriptService]

asmx.cs页面中的这一行

 [System.Web.Script.Services.ScriptService]

答案 2 :(得分:1)

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

  

无法对另一个服务执行异步POST   域,由于相同来源的(非常明智的)限制   政策。 JSON-P仅适用,因为您可以插入   标记到DOM中,它们可以指向任何地方。

Post data to JsonP

答案 3 :(得分:1)

您应该将ajax帖子发回到您自己网站中的某个页面,然后向您想要数据的域或服务请求。 您在Chrome中看到500错误,因为Web服务代码中存在错误。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

你忘了把localhost或你服务器的任何ip放入。

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

你用于网络服务电话的网址

所以用

替换它
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();

}

答案 6 :(得分:0)

可能存在跨域问题。将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服务中提供的帮助。

答案 7 :(得分:0)

尝试在 system.web

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

此外,如果您遇到参数丢失错误,请尝试将数据更改为:

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

让我知道这是否有效。

答案 8 :(得分:0)

如果您控制两个域,可能更容易使用相同的基本域进行设置。例如intraanetv1.mysite.com和intranetv35.mysite.com。然后你可以设置document.domain = mysite.com,并且应该放宽相同的原始策略。

答案 9 :(得分:0)

如果您控制两个域,可能更容易使用相同的基本域进行设置。例如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

答案 10 :(得分:0)

使用(配置并实施)CORS,并将您的内容发送为“application / 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