如何在JQuery中调用跨域Web服务/ WCF

时间:2010-11-15 19:22:32

标签: asp.net jquery wcf jsonp

UPDATE1:

这是我在IE浏览器中复制并粘贴服务URL时所得到的:

HTTP://myservername/myservices.svc WSDL

- <wsdl:message name="ILodge_GetCountfor">
  <wsdl:part name="parameters" element="tns:GetCountfor" /> 
  </wsdl:message>
- <wsdl:message name="ILodge_GetCountfore">
  <wsdl:part name="parameters" element="tns:GetCountfor" /> 
  </wsdl:message>
- <wsdl:message name="ILodge_GetCountfor_Input">
  <wsdl:part name="parameters" element="tns:GetCountfor" /> 
  </wsdl:message>
- <wsdl:message name="ILodge_GetCountfor">
  <wsdl:part name="parameters" element="tns:GetCountfor" /> 
  </wsdl:message>

HTTP://myservername/myservices.svc XSD = xsd0

- <xs:element name="GetCountfor">
- <xs:complexType>
- <xs:sequence>
  <xs:element minOccurs="0" name="GetCountforResult" type="xs:long" /> 
  </xs:sequence>
  </xs:complexType>
  </xs:element>
- <xs:element name="GetCountfor">
- <xs:complexType>
- <xs:sequence>
  <xs:element minOccurs="0" name="Id" nillable="true" type="xs:string" /> 
  <xs:element minOccurs="0" name="LevelId" type="xs:long" /> 
  </xs:sequence>
  </xs:complexType>
  </xs:element>
- <xs:element name="GetCountfor">
- <xs:complexType>
- <xs:sequence>
  <xs:element minOccurs="0" name="GetCountfor" type="xs:long" /> 
  </xs:sequence>
  </xs:complexType>
  </xs:element>

更新

我看到服务正在以XML格式返回:

 public override string ToString()
    {            
        //- <name>CLUE</name><desc>CLUE list</desc> 
        StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        sb.AppendLine("<kml xmlns=\"someSITE">");
        sb.AppendLine("<FOLDER>");
        sb.AppendLine("<name>Clue</name>");
        sb.AppendLine("<desc>Clue list</desc>");
        sb.AppendLine("</FOLDER>");
        sb.AppendLine("</kml>");
        return sb.ToString();
    }

我尝试过不同的方式执行以下跨域引用但没有成功......我在这里做错了什么?我尝试调试并设置断点,但看起来它永远不会执行

 $(document).ready(function () {

$.getJSON("http://servername/tools/myservice.svc/mymethod/?Id=1&callback=?", null,           
      function (result) {
        alert("in test: " + result);
        debugger
        $("#spText").html(result);
    }); 

OR

        var path = "http://servername/tools/myservice.svc/mymethod?Id=1&callback=?";
             $.ajax({
                 type: "GET",
                 url: path,
                 contentType: "application/json; charset=utf-8",
                 dataType: "json",
                 async: false,
                 success: function (response) {
                    debugger
                     if (response != null) {
                         //displayData(response);
                     }
                 }
             });

OR
             debugger
             $.ajax({ url: "http://servername/tools/myservice.svc/mymethod",
                 data: { Id: "1" },
                 dataType: "jsonp",
                 success: function (json, textStatus) {
                     alert(json.d);
                     alert(textStatus);
                 },
                 error: function (XMLHttpRequest, textStatus, errorThrown) {
                     debugger
                 }
             });


    OR
             $.ajax({
                 type: "GET",
                cache: false,
                url: "http://servername/tools/myservice.svc/mymethod/Id=1&callback=?",
                              scriptCharset: "utf-8",
                              dataType: "jsonp",
                              data: parameters,
                              success: function (data, textStatus) {
                                  debugger
                              },
                              error: function (XMLHttpRequest, textStatus, errorThrown) {
                                  debugger
                              }
                          });
}

5 个答案:

答案 0 :(得分:1)

  

我尝试过不同的方式来执行以下跨域引用,但没有成功......

由于安全风险,浏览器不允许跨域ajax请求。如果您的网页和Web服务位于不同的域中,则需要在与您的网页相同的域中添加第二个页面来代理请求。

答案 1 :(得分:0)

我猜“响应”无效jsonp。

将网址复制到您的浏览器地址栏中,向我们展示您将看到的内容。

以下是jsonp的示例:

someFunction({'foo':'some foo','bar':'some bar'})

来自flickr的实例:http://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=08e4f6fc4216b1216c5f521133ecbd9b&jsoncallback=functionName

它看起来像是一个带有object-literal作为参数的函数的调用。它看起来像是,因为它以后会是一个函数调用。 jsonp的工作方式是: 一个<script>元素将被注入DOM,它将提供的URL设置为src-attribute。所以ressource不是字符串或XML文档,它是一个javascript文件。如果它被嵌入到文档中,它将被执行并且参数可以访问。

我不能告诉你创建jsonp的最终方式,这取决于你从哪里获取数据以及你喜欢用它做什么(当然还有给定的环境)。

答案 2 :(得分:0)

WCF服务的正常.Net扩展名是.svc,看起来你所有的调用都是.svs

我不认为.svs是一个普通的.net扩展,所以运行时甚至可能都没有尝试执行调用服务器端。

更改扩展程序或重新配置您的网络服务器。

答案 3 :(得分:0)

说实话,我不知道asp.net,但我想你错过了逃避这一点          sb.AppendLine("<kml xmlns=\"someSITE">");,应该是:sb.AppendLine("<kml xmlns=\"someSITE\">");

你可以从SO编辑器的突出显示功能告诉它,谢谢SO团队:)

   public override string ToString()
        {            
            //- <name>CLUE</name><desc>CLUE list</desc> 
            StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
            sb.AppendLine("<kml xmlns=\"someSITE\">");
            sb.AppendLine("<FOLDER>");
            sb.AppendLine("<name>Clue</name>");
            sb.AppendLine("<desc>Clue list</desc>");
            sb.AppendLine("</FOLDER>");
            sb.AppendLine("</kml>");
            return sb.ToString();
        }

答案 4 :(得分:0)

严格禁止XMLHttpRequest对象调用最初为该页面提供服务的域之外的Web服务。这有很大的安全原因。

在您的情况下,为该页面提供服务的域名是“localhost”。 javascript无法访问远程Web服务。你不会绕过这个。

那说,你有一个选择。你可以让你的javascript命中一个本地Web服务,它转过来并调用REMOTE Web服务并将信息传递回你的javascript。有关详细信息,请参阅this article on Simple-Talk,其中详细介绍了您可以使用的几种可能选项。