使用jQuery消耗.NET Web服务时出错

时间:2012-02-06 15:01:58

标签: jquery web-services asmx

我正在尝试访问我创建的并在此位置运行的.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>

也许这可以帮助你解决我的问题?我的意思是显然数据按预期正确地返回到我的台式机,但是调用了错误函数而不是成功的。

谢谢!

2 个答案:

答案 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>