Клиенты WCF Polling Duplex и клиенты не Silverlight - PullRequest
1 голос
/ 05 ноября 2010

У меня чертовски много времени, чтобы понять это.У меня есть сервис WCF, который мне нужен для загрузки информации в клиент Silverlight, но мне нужно консольное приложение, чтобы также участвовать в этом.Может ли кто-нибудь дать мне подсказку о том, как должен выглядеть мой Web.Config, чтобы указать дополнительную привязку, к которой могло бы получить доступ консольное приложение?Когда я думаю, что все работает, клиенты SL не могут получать никаких сообщений ...

Вот мой текущий Web.Config:

<?xml version="1.0"?>

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <extensions>
      <bindingExtensions>
        <add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <!-- Create the polling duplex binding. -->
    <bindings>
      <pollingDuplex>
        <binding name="myPollingDuplex"
                 duplexMode="MultipleMessagesPerPoll">
        </binding>
      </pollingDuplex>
    </bindings>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name ="EdiManager.Web.EdiPubSub">
        <endpoint address=""
                  binding="pollingDuplex"
                  bindingConfiguration="myPollingDuplex"
                  contract="EdiManager.Web.EdiPubSub"
                  />
        <endpoint address="mex" 
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>
    </services>
    </system.serviceModel>
</configuration>

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

Хотите ли вы, чтобы консольное приложение также участвовало в дуплексном соединении? Или вы хотите использовать другую привязку запрос-ответ?

Кроме того, я заметил, что вы используете AspNetCompatibility с опросом дуплекса. Если вы получаете доступ к состоянию сеанса, у вас могут возникнуть проблемы с производительностью. Я написал короткую запись в блоге , в которой упоминается запись в блоге MSDN с информацией о тестировании.

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

1 голос
/ 06 ноября 2010

Если вам не нужен полный дуплекс, просто используйте wsHttpBinding вместо mex (или предоставьте больше информации, чего бы вы хотели достичь).

0 голосов
/ 08 ноября 2010

Мне удалось заставить его работать, отредактировав конфигурацию с помощью редактора WCF Service и не выполнив это вручную.Очевидно, я допустил некоторую ошибку, редактируя конфигурацию вручную.Вот web.config, который работает:

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

  <system.serviceModel>
    <extensions>
      <bindingExtensions>
        <add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <!-- Create the polling duplex binding. -->
    <bindings>
      <wsDualHttpBinding>
        <binding name="myDualHttp" />
      </wsDualHttpBinding>
      <pollingDuplex>
        <binding name="myPollingDuplex" duplexMode="MultipleMessagesPerPoll" />
      </pollingDuplex>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="EdiManager.Web.EdiPubSub">
        <endpoint address="Silverlight" binding="pollingDuplex" bindingConfiguration="myPollingDuplex"
          name="Silverlight" contract="EdiManager.Web.EdiPubSub" />
        <endpoint address="Console" binding="wsDualHttpBinding" bindingConfiguration="myDualHttp"
          name="Console" contract="EdiManager.Web.EdiPubSub" />
      </service>
    </services>
    </system.serviceModel>
</configuration>
...