как вызвать кросс-доменный WebService / WCF в JQuery - PullRequest
1 голос
/ 15 ноября 2010

ОБНОВЛЕНИЕ1:

вот что я получаю, когда копирую и вставляю URL службы в браузере IE:

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();
    }

iпробовал другой способ выполнить приведенную ниже междоменную ссылку, но безуспешно ... что я здесь не так делаю?я пытаюсь отладить и поставить точку останова, но похоже, что она никогда не выполняется

 $(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 ]

1 голос
/ 15 ноября 2010

Я пробовал другой способ выполнить приведенную ниже междоменную ссылку, но безуспешно ...

Браузеры не разрешают междоменные запросы ajax из-за угроз безопасности. Если ваша веб-страница и веб-служба находятся в разных доменах, вам нужно добавить вторую страницу, в том же домене, что и ваша веб-страница, для брокера запросов.

0 голосов
/ 17 ноября 2010

Объекту XMLHttpRequest строго запрещено вызывать веб-службы за пределами домена, который первоначально обслуживал страницу.Для этого есть огромные причины безопасности.

В вашем случае домен, который обслуживал страницу, является "localhost".Javascript не может получить доступ к удаленному веб-сервису.Вы не сможете обойти это.

Тем не менее, у вас есть возможность.Вы можете сделать так, чтобы ваш javascript попал в локальный веб-сервис, который поворачивается и вызывает удаленный веб-сервис и передает информацию обратно в ваш javascript.Для получения дополнительной информации см. эту статью о Simple-Talk , в которой подробно рассматриваются несколько возможных вариантов, доступных вам.

0 голосов
/ 15 ноября 2010

Обычное расширение .Net для служб WCF - это .svc. Похоже, что все ваши вызовы относятся к .svs

. Я не думаю, что .svs - это нормальное расширение .net, поэтому среда выполнения, вероятно, недаже пытаясь выполнить вызов на стороне сервера.

Измените расширения или перенастройте свой веб-сервер.

0 голосов
/ 15 ноября 2010

Если честно, я не знаю насчет asp.net, но я думаю, что вы пропустили это sb.AppendLine("<kml xmlns=\"someSITE">");, должно быть как: sb.AppendLine("<kml xmlns=\"someSITE\">");

Вы можете сказать это с помощью функции выделения SO-редактора, спасибо SO Team :)

   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();
        }
0 голосов
/ 15 ноября 2010

Я думаю, что "ответ" не действителен jsonp.

Скопируйте URL в адресную строку браузера и покажите нам, что вы увидите.

Вот пример того, как выглядит 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

Это похоже на вызов функции с литералом объекта в качестве аргумента. Это выглядит так, потому что позже это будет вызов функции. JSONP работает следующим образом: Элемент <script> будет внедрен в DOM, который установил предоставленный URL-адрес как src-атрибут. Таким образом, ресурс не является строкой или XML-документом, это javascript-файл. Если он встроен в документ, он будет выполнен и аргумент доступен.

Я не могу сказать вам окончательный способ создания jsonp, это зависит от того, откуда вы берете данные и что вам нравится делать с ними (и, конечно же, в данной среде).

...