2010-11-15 1 views
1

Update1:как позвонить междоменного WebService/WCF в JQuery

вот что я получаю, когда я скопировать и вставить 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> 

UPDATE:

я вижу услуги возвращает меня как 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 
           } 
          }); 
} 
+0

Возможный дубликат [доступ запрещен с использованием jquery-1.4.1.js] (http://stackoverflow.com/questions/4146650/access-is-denied-using-jquery-1-4-1-js) – lonesomeday

+0

Пожалуйста, отредактируйте существующие вопросы, а не публикуйте новые, когда они будут той же проблемой. – lonesomeday

+0

Я не получаю доступ к отрицательной ошибке в размещенном вопросе. –

ответ

0

Я предполагаю, что «ответ» не является действительным JSONP.

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

Вот пример того, как JSONP выглядит следующим образом:

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

Живой пример из фликра: http://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=08e4f6fc4216b1216c5f521133ecbd9b&jsoncallback=functionName

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

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

+0

Я просмотрел сервис и конкретный метод, который я пытаюсь назвать его «длинным», всего несколько цифр –

+0

Я обновил свой вопрос ... –

+0

Я вижу. Вы должны проверить, доступен ли servive в jsonp-формате. Если нет, вам нужно создать прокси-сервер (на сервере), который получает ответ с удаленного сервера и пересылает его в html-документ. –

0

Нормальное расширение .Net для служб WCF является .svc это выглядит как все ваши звонки на .svs

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

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

+0

моя ошибка была опечатка, и я исправил svc –

0

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

вы можете сказать это с подсветкой особенности 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(); 
     } 
+0

выглядит как я испортил, когда я менял имя сайта, поэтому я не думаю, что это проблема, почему мой jquery не выполняется. –

1

я попробовали другой способ выполнить ссылку на перекрестный домен, но не успели ...

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

+0

Я являюсь tyring для доступа к wcf-сервисам через html-страницу, поэтому у меня нет веб-страниц. –

+0

Я использую html-страницу и веб-страницу синонимом в своем ответе. Является ли служба wcf в том же домене, что и страница html? – roto

+0

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

0

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

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

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