2012-06-29 7 views
4

Я делаю запрос GET к веб-сервису WCF. Моя служба WCF находится в http://localhost/RestService/RestService.svc/web/GetMessage и имеет следующий интерфейс:jQuery GET сбой без сообщения об ошибке

[OperationContract] 
[WebGet(UriTemplate = "GetMessage", ResponseFormat = WebMessageFormat.Json)] 
String GetMessage(); 

Конечный настроен должным образом, как я могу сделать голый вызов в течение моего браузера:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WebServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 

     <endpointBehaviors> 
     <behavior name="WebEndpointBehavior"> 
      <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <services> 
     <service name="TestRestService.RestService" 
       behaviorConfiguration="WebServiceBehavior"> 
     <endpoint name="RestWeb" 
        address="web" 
        binding="webHttpBinding" 
        behaviorConfiguration="WebEndpointBehavior" 
        contract="TestRestService.IRestService" /> 
     </service> 
    </services> 
    </system.serviceModel> 

Calling его с помощью навигации в браузере возвращается:

{"GetMessageResult":"Hello World!"} 

Пока все хорошо. Здесь нет проблем. Быстрый взгляд на jQuery documentation для выполнения GET выходов:

<html> 
    <head> 
     <script type="text/javascript" src="jquery-1.7.2.min.js"></script> 
     <script type="text/javascript"> 
      $.ajax({ 
       url: 'http://localhost/RestService/RestService.svc/web/GetMessage', 
       type: 'GET', 
       dataType: 'json', 
       success: function (data) { 
        alert(data); 
       }, 
       error: function (xhr, status, message) { 
        alert("Error: " + status + " " + message); } 
       }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

я запускаю это в небольшой тестовой странице HTML с помощью JQuery 1,72, и я получаю следующее сообщение об ошибке:

Error: error 

Что дает? Обработчик сообщения об ошибке that I found here дает мне абсолютно нулевой полезная информация. Проще говоря:

  • Почему мой отказ GET?
  • Почему сообщение об ошибке бесполезно?

Решение

Как выясняется, JQuery изначально не поддерживает запросы Ajax междоменные, как Кевин B suggested in his answer. Чтобы исправить это, я должен был переключиться на использование dataType: 'jsonp' и добавить webHttpBinding с crossDomainScriptEnabled собственности позволила:

<bindings> 
    <webHttpBinding> 
    <binding name="WebBindingWithScripts" 
      crossDomainScriptAccessEnabled="true"> 
     <security mode="None" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 


<endpoint name="RestWeb" 
      address="web" 
      binding="webHttpBinding" 
      behaviorConfiguration="WebEndpointBEhavior" 
      bindingConfiguration="WebBindingWithScripts" 
      contract="TestService.IRestService"> 
</endpoint> 

При использовании только dataType: 'jsonp', вы все равно получите ошибки, если не настроить службу WCF, чтобы скрипты Междоменных.

+0

Попробуйте с помощью Devtool браузера (для хром ctrl + shift + J). Вы видите, что запрос идет? Любые ошибки на консоли? – SuperSaiyan

+0

Попробуйте удалить 'dataType' и дайте jquery сделать это. Вы также можете попробовать установить 'dataType: 'jsonp''. –

+0

Вы уверены, что веб-служба возвращает MIME-тип json/application? – Ian

ответ

2

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

Есть две причины, по которым просьба будет неудовлетворительной в этом случае:

  1. JSON возвращается имеет дополнительные символы, которые делают его недействительным JSON
  2. запрос поступает из другого домена, чем веб-сервис ,

Я ожидаю, что это будет # 1 из-за того, что вы не заметили ошибку в консоли на same-origin. Однако, поскольку вы получаете error, а не parseerror, это маловероятно.

+1

Я делаю локальный локальный запрос. Страница и сервис находятся на одной и той же странице. Фактически, сама страница - это просто простой html с jQuery, который я разместил выше. –

+0

Исправление: я хочу сказать, что страница и служба находятся на одной и той же точной * машине *. Однако я попытаюсь разместить мою тестовую html-страницу на моем сервере IIS, чтобы убедиться, что это что-то изменит. –

+1

Это была проблема №2. Я поместил свой html-файл в приложение IIS, на котором размещен мой сервис, и он отлично работает. Существует ли какое-либо обходное решение, если служба IIS и веб-страница находятся в отдельных доменах? –

2

Это случилось со мной однажды, все, что я делал, добавляло endpointBehaviors в мою сеть.конфигурации для поддержки запросов WebHttp как этого

<behaviors> 
    <serviceBehaviors> 
    ...... 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="EndpBehavior"> 
      <webHttp/> 
     </behavior> 
    </endpointBehaviors> 

и изменили мою конечную точку, чтобы включить «behaviorConfiguration» и изменили связывание

<endpoint address="" binding="webHttpBinding" contract="IService1" 
    behaviorConfiguration="EndpBehavior"> 

Не забудьте добавить это к вашему IService:

[WebGet(ResponseFormat =WebMessageFormat.Json)] 
+0

Мое поведение конечной точки и конечной точки (без имени контракта, имени поведения конечной точки) совпадают. Вы хотите, чтобы я добавил конфигурацию к вопросу? –

+0

Да, Майк. Будет лучше. –

+0

См. Мой вопрос. Я дал СБСЕ. –

Смежные вопросы