JQuery / WCF без ASP.NET AJAX: - PullRequest
       4

JQuery / WCF без ASP.NET AJAX:

10 голосов
/ 17 марта 2009

Я изо всех сил пытаюсь получить тот «волшебный» момент, когда WCF хорошо настроен, а jQuery хорошо структурирует свои запросы / понимает ответы.

У меня есть услуга:

<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"  %>

Это было рекомендовано человеком Риком Штролом , чтобы избежать необходимости определять поведение в Web.config.

Мой интерфейс для службы WCF находится в другой сборке:

namespace xxx.yyy.WCF.Data
{       
    [ServiceContract(Namespace = "yyyWCF")] 
    public interface IClientBroker
    {
        [OperationContract]         
        [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)]
        IClient GetClientJson(int clientId);    
    }
}

Конкретный класс обслуживания:

namespace xxx.yyy.WCF.Data
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    class ClientBroker : IClientBroker 
    {
        public IClient GetClientJson(int clientId)
        {
            IClient client=new Client();

            // gets and returns an IClient
            return client;
        }
    }
}

My IClient - это класс Entity Framework, поэтому он соответствующим образом снабжен атрибутами DataContract / DataMember.

Я пытаюсь вызвать службу WCF, используя методы, описанные в блоге Рика Страла по адресу http://www.west -wind.com / weblog / posts / 324917.aspx («полная версия»). Отладчик переходит в сервис WCF нормально (так что мой jQuery / JSON понимается) и получает IClient и возвращает его. Однако, когда я возвращаю ответ, я получаю различные бесполезные ошибки. Ошибки, которые я получаю, ничего не значат.

Я использую POST.

Правильно ли я использую интерфейс вместо конкретного объекта? Когда он попадает в службу WCF, он, похоже, является кодировкой результата, который не выполняется.

У кого-нибудь есть идеи?

Ответы [ 3 ]

10 голосов
/ 17 марта 2009

На первый взгляд есть три проблемы с вашим кодом:

1: вы должны использовать ServiceKnownTypeAttribute , чтобы указывать известные типы при представлении только базовых типов в ваших операционных контрактах:

[ServiceContract(Namespace = "yyyWCF")]     
public interface IClientBroker
{
    [OperationContract]
    [ServiceKnownType(typeof(Client))]
    [WebInvoke(
        Method="GET",
        BodyStyle=WebMessageBodyStyle.WrappedRequest,
        ResponseFormat=WebMessageFormat.Json)]
    IClient GetClientJson(int clientId);

}

2: Вы должны использовать WebMessageBodyStyle.WrappedRequest вместо WebMessageBodyStyle.Wrapped, поскольку последний несовместим с WebScriptServiceHostFactory .

3: IMHO с использованием Method = "GET" было бы более RESTful для метода с именем GetClientJson, чем Method = "POST"

Еще один совет, который я мог бы дать вам при работе со службами WCF, - это использовать SvcTraceViewer.exe в комплекте с Visual Studio. Это отличный инструмент для отладки. Все, что вам нужно, это добавить следующий раздел в ваш app / web.config:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="sdt"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "WcfDetailTrace.e2e" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Затем вызовите веб-метод, и файл WcfDetailTrace.e2e будет создан в корневом каталоге вашего веб-сайта. Затем откройте этот файл с помощью SvcTraceViewer.exe, и вы увидите много полезной информации. Например, это может сказать:

Невозможно сериализовать параметр типа MyNamespace.Client (для работы GetClientJson, контракт «IClientBroker»), потому что это не точный тип 'MyNamespace.IClient' в подпись метода и не находится в коллекция известных типов. Чтобы сериализуйте параметр, добавьте тип в коллекцию известных типов для операция с использованием ServiceKnownTypeAttribute.

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

2 голосов
/ 17 марта 2009

Я на 99% уверен, что вы не можете вернуть интерфейс. Я не думаю, что интерфейсы сериализуемы.

проверить эту тему

0 голосов
/ 31 августа 2010

Относительно вопроса, недавно я опубликовал в своем блоге статью, в которой были показаны все шаги, необходимые для работы службы WCF вместе с кодом jQuery на стороне клиента:

http://yoavniran.wordpress.com/2009/08/02/creating-a-webservice-proxy-with-jquery/

...