我有两个内部网站点:
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开发者工具中收到的错误消息的屏幕截图: 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"];
}
}
}
答案 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中,它们可以指向任何地方。
答案 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