none
Как в WCF-службе поменять тип привязки с basicHttpBinding на WSDualHttpBinding ? RRS feed

  • Вопрос

  • Добрый день. Я создаю в WCF-службе дуплексный контракт, а потом пытаюсь добавить в WPF-клиент, находящийся в том же решении, ссылку на эту службу (через меню "Добавить ссылку на службу") и у меня оявляется ошибка "Контракту требуется свойство Session: однако привязка basicHttpBinding его не поддерживает или это не позволяет неправильная настройка".  Пробую в файле app.config службы заменить basicHttpBinding на  WSDualHttpBinding и появляется другая ошибка: "Атрибут binding недействителен с зрения его типа данных serviceBindingType - сбой ограничения Enumeration". Что мне тут надо сделать? На всякий случай, ниже полностью привожу файл конфигурации службы App.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- Во время развертывания проекта библиотеки служб содержимое файла конфигурации необходимо добавить к файлу 
      app.config на узле. Файлы конфигурации для библиотек не поддерживаются System.Configuration. -->
      <system.serviceModel>
        <services>
          <service name="DownloadManager.DownloadManagerService">
            <endpoint address="" binding="basicHttpBinding" contract="DownloadManager.IDownloadManagerService">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8733/Design_Time_Addresses/DownloadManager/DownloadManagerService/" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!--Чтобы избежать раскрытия метаданных, 
              до развертывания задайте следующим параметрам значение "false".-->
              <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
              <!-- Чтобы получить сведения об исключениях в ошибках для отладки, 
              установите ниже значение TRUE. Перед развертыванием установите значение FALSE, 
               чтобы избежать разглашения сведений об исключении -->
              <serviceDebug includeExceptionDetailInFaults="True" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    
    </configuration>

    Как решить эту проблему?

Ответы

  • Понял в чём была ошибка. Я писал WSDualHttpBinding, а надо было wsDualHttpBinding. Хотя в MSDN название этого класса почему-то с большой буквы.
    • Помечено в качестве ответа Purple_Apple 1 июля 2014 г. 14:44
    1 июля 2014 г. 14:43

Все ответы

  • Здравствуйте, помню когда то создавал сервис дуплексом. а вы в интерфейсе указали CallbackContract?

    Например

    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ITimerServiceCallback))]
        public interface ITimerService
        {
            [OperationContract]
            void SubscribeAppl(Guid applId);
            
            [OperationContract]
            void UnsubscribeAppl(Guid applId);
            
            [OperationContract]
            void KeepConnection();
        }
    
        /// <summary>
        /// точка обратного вызова
        /// </summary>
        public interface ITimerServiceCallback
        {      
            [OperationContract]
            void HandleMessage(Message message);
        }
    После этой реализации, в веб конфиге должна автоматически настроиться

    Mak Arti

    1 июля 2014 г. 10:12
  • Да, указал. Вот всё это хозяйство:

    // Основной интерфейс; используется для посылки сообщений от клиента к службе.
        [ServiceContract(Namespace="http://DownloadManager",SessionMode=SessionMode.Required,
            CallbackContract=typeof(IDownloadManagerServiceCalback))]
        public interface IDownloadManagerService
        {
            /// <summary>
            /// Добавляет очередную закачку в коллекцию закачек.
            /// </summary>
            /// <param name="p_TargetUrl">URL, по которому расположен скачиваемый ресурс</param>
            /// <param name="p_PathToSave">Путь к месту на локальном жёстком диске,
            /// где будут сохранены закаченные данные</param>
            [OperationContract(IsOneWay=true)]
            void AddDownload(String p_TargetUrl, String p_PathToSave);
    
            /// <summary>
            /// Запускает выбранную закачку.
            /// </summary>
            /// <param name="p_UniqueId">Уникальный идентификатор выбранной закачки.</param>
            [OperationContract(IsOneWay=true)]
            void StartDownload(Guid p_UniqueId);
    
            /// <summary>
            /// Приостанавливает выбранную закачку.
            /// </summary>
            /// <param name="p_UniqueId">Уникальный идентификатор выбранной закачки.</param>
            [OperationContract(IsOneWay=true)]
            void SuspendDownload(Guid p_UniqueId);
    
            /// <summary>
            /// Возобновляет выполнение выбранной приостановленной закачки.
            /// </summary>
            /// <param name="p_UniqueId">Уникальный идентификатор выбранной закачки.</param>
            [OperationContract(IsOneWay=true)]
            void ResumeDownload(Guid p_UniqueId);
    
            /// <summary>
            /// Удаляет выбранную закачку.
            /// </summary>
            /// <param name="p_UniqueId">Уникальный идентификатор выбранной закачки.</param>
            [OperationContract(IsOneWay=true)]
            void DeleteDownload(Guid p_UniqueId);
        }
    
        // Интерфейс обратного вызова; используется для посылки сообщений от службы назад к клиенту.
        public interface IDownloadManagerServiceCalback
        {
            /// <summary>
            /// Возвращает клиенту коллекцию выполняющихся или ожидающих выполнения закачек.
            /// </summary>
            /// <returns></returns>
            [OperationContract(IsOneWay=true)]
            void UpdateSelectedDownload(Downloader p_SelectedDownload);
        }

    Класс Downloader я здесь не привожу. Он не причём.

    А вот такая "шапка" у класса, реализующего основной интерфейс контракта:

    /// <summary>
    /// Реализует интерфейс IDownloadManagerService.
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class DownloadManagerService : IDownloadManagerService
    {
       . . . . . . . 
    }

    Почему возникает ошибка при добавлении службы к клиенту - не знаю. Но из-за неё не могу добавить в клиент ссылку на службу.



    1 июля 2014 г. 11:24
  • Понял в чём была ошибка. Я писал WSDualHttpBinding, а надо было wsDualHttpBinding. Хотя в MSDN название этого класса почему-то с большой буквы.
    • Помечено в качестве ответа Purple_Apple 1 июля 2014 г. 14:44
    1 июля 2014 г. 14:43
  • ясно, буду знать)

    Mak Arti