Почему эта служба WCF недоступна через JSON Ajax? - PullRequest
1 голос
/ 02 ноября 2011

У меня есть служба WCF, которую нужно вызывать через SOAP (работает) и через JSON (не работает).

Мой код C #:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    string Foo();
}

public class Service1 : IService1
{
    public string Foo()
    {
        return "woohooo";
    }
}

А вот мой конфиг:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <services>
      <service name="Service1">
        <endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
        <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="DummyService.IService1"/>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <enableWebScript/>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

А вот мой Javascript:

$.getJSON("/Service1.svc/Foo")
    .success(function (result) {
        alert("success! " + result);
    })
    .fail(function (result) {
        console.log("failed!");
        console.log(result);
    });

Я получаю ответ "400 Bad Request". Что я делаю неправильно? Я следовал совету в конечных точках REST / SOAP для службы WCF , но он все еще не работает. :-) Помогите!

Ответы [ 4 ]

1 голос
/ 03 ноября 2011

(Мой третий ответ. Я знаю, что ОДИН из этих ответов будет правильным: -)

Попробуйте установить для aspNetCompatibilityEnabled значение true в сервисе Хостинг-Среда.

   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

Это всего лишь предположение. Когда я отключаю это в моей реализации, вызов все еще приходит, но HttpContext.Current возвращает NULL.

1 голос
/ 02 ноября 2011

Попробуйте включить адрес конечной точки в URL службы.Что-то вроде:

$.getJSON("/Service1.svc/json/Foo")

Кроме того, вы должны включить трассировка WCF , чтобы увидеть, какая ошибка возвращается.Вам понадобится Service Trace Viewer для просмотра информации журнала.

ОБНОВЛЕНИЕ:

Ниже приведен пример использования работающего кода.

Файл конфигурации содержит

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

    <services>
      <service behaviorConfiguration="jsonServiceBehavior" name="DummyService.Service1">
        <endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
        <endpoint address="json" 
                  behaviorConfiguration="jsonBehavior" 
                  binding="webHttpBinding" contract="DummyService.IService1"/>
      </service>
    </services>

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

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

Я создал пустой веб-проект и добавил следующую HTML-страницу для тестирования службы.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $.getJSON("/Service1.svc/json/Foo")
            .success(function (result) {
                alert("success! " + result);
            })
            .fail(function (result) {
                console.log("failed!");
                console.log(result);
            });
        });
    </script>
</head>
<body>    

</body>
</html>

И мой Service1.svcимеет следующее:

<%@ ServiceHost Language="C#" Service="DummyService.Service1" %>
1 голос
/ 02 ноября 2011

Попробуйте извлечь элемент <webHttp /> из поведения конечной точки.

У меня есть веб-сервис, который вызывается Ajax, и у него нет этого элемента.

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

(по общему признанию, это было связано с не распознаванием форматов даты, так что это не совсем соответствует вашей проблеме).

1 голос
/ 02 ноября 2011

Я думаю, это потому, что используемый вами URL-адрес является абсолютным, а не относительным.

Если вы запускаете это в отладчике ASP.NET, служба будет доступна по следующему адресу:

http://localhost:52200/Web/Service1.svc

Поскольку перед URL стоит косая черта, запрос на обслуживание фактически отправляется на

http://localhost:52200/Service1.svc

Таким образом, вам нужно передать соответствующий относительный адрес. Если ваша служба и файл сценария находятся в одном каталоге, измените его на:

$.getJSON("./Service1.svc/Foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...