我正在尝试访问我创建的并在此位置运行的.Net Web服务(.asmx):http://sebtest.somee.com/page/webservice/PositionService.asmx
在本地调用服务工作正常,但在服务器上使用jQuery消费它会失败。该服务按以下方式编写:
namespace WcfService1
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// Below line allows the web service to be called through HTTP protocol.
[ScriptService]
public class ServiceImpl : System.Web.Services.WebService, IService1j
{
[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public PositionReturnType getLastLocation(){
.
.
我还创建了一个asp.net网页,在启动时直接尝试访问getLastLocation方法。该页面位于:http://sebtest.somee.com/page/
如您所见,我只会收到错误。
网页的代码就是这个:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
<title>Call web service test</title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder ID="HeadContent" runat="server">
</asp:ContentPlaceHolder>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.min.js"></script>
<script type="text/javascript">
function CallService() {
$.ajax({
type: "POST",
url: "http://sebtest.somee.com/page/webservice/PositionService.asmx?op=getLastLocation",
dataType: "json",
success: function (data, textStatus, jqXHR) {
alert('worked');
},
error: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR + ' - ' + textStatus + ' - ' + errorThrown);
}
});
}
</script>
</head>
<body onload="CallService()">
<form runat="server">
我意识到大多数示例使用我的服务不回复的URL形式“服务/方法名称”。相反,该方法可以在位置sebtest.somee.com/page/webservice/PositionService.asmx?op=getLastLocation下查看这可能是某种问题吗?
我很乐意为您提供任何帮助!也许你可以给我一个调用我的服务的例子。
非常感谢您的帮助:)
塞巴斯蒂安
编辑:我现在意识到我可以通过更改web.config文件手动打开Web服务以获取HTTP Get和HTTP Post请求。我这样做了,我尝试通过以下方式从桌面本地运行的网页访问web服务:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
function CallService() {
$.ajax({
type: "GET",
url: "http://sebtest.somee.com/page/webservice/PositionService.asmx/getLastLocation?",
dataType: "xml",
error: function (xhr, textStatus, errorThrown) {
alert('nooo ' + xhr + ' - ' + textStatus + ' - ' + errorThrown);
},
success: function (data, textStatus, jqXHR) {
alert('jaaa ' + data + " - " + textStatus + " - " + jqXHR);
}
});
}
不幸的是,这仍然会导致调用错误函数。在chrome中没有显示错误文本,IE显示“No transport”。但是,我也使用了Fiddler2,我得到了以下响应,这正是我需要的:
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 07 Feb 2012 13:06:37 GMT
Content-Length: 266
<?xml version="1.0" encoding="utf-8"?>
<PositionReturnType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<longtitude>3</longtitude>
<latitude>9</latitude>
</PositionReturnType>
也许这可以帮助你解决我的问题?我的意思是显然数据按预期正确地返回到我的台式机,但是调用了错误函数而不是成功的。
谢谢!
答案 0 :(得分:0)
将您的网址更改为"http://sebtest.somee.com/page/webservice/PositionService.asmx/getLastLocation"
,看看是否适合您。
答案 1 :(得分:0)
我没有真正找到问题的答案,但我使用的是另一种方法(http://www.codeproject.com/Articles/223572/Calling-Cross-Domain-WCF-service -using-Jquery-Java)并且完美无缺。
如果您还考虑使用此方法,最后一条建议,您可能会发现使用此描述的web.config配置很有帮助:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="None">
</authentication>
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>