3

我有 2 个 Intranet 站点:

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 开发人员工具中收到的错误消息的屏幕截图: 在此处输入图像描述 单击此处查看完整分辨率


这是 .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"];
            }
        }
    }
4

11 回答 11

2

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

更新 将您的网络方法标记为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

于 2013-07-01T09:26:45.657 回答
1

删除评论

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

asmx.cs 页面中的这一行

 [System.Web.Script.Services.ScriptService]
于 2013-07-01T10:29:42.287 回答
1

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

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

将数据发布到 JsonP

于 2013-07-01T14:49:26.537 回答
1

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

于 2013-07-01T17:52:36.113 回答
0

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

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

于 2013-07-01T09:39:33.087 回答
0

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

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

在您用于网络服务调用的 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();

}
于 2013-07-01T09:47:02.143 回答
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 服务中的帮助。

于 2013-07-01T10:10:19.623 回答
0

尝试在system.web内的 web.config 中添加以下内容

  <webServices>
    <protocols>
      <add name="HttpGet"/>
      <add name="HttpPost"/>
    </protocols>
  </webServices>

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

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

让我知道这个是否奏效。

于 2013-07-01T10:41:20.933 回答
0

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

于 2013-07-05T23:13:11.187 回答
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

于 2013-07-05T23:17:08.560 回答
0

使用(配置和实施)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

于 2013-07-07T18:27:45.010 回答