Привязка net.tcp с потоковым режимом передачи = режим кадрирования Singleton не поддерживается - PullRequest
1 голос
/ 30 марта 2011

Я пытаюсь реализовать шаблон «забей и забудь» в методе WCF.У меня это работает в моей локальной среде, но столкнулся с проблемой при работе на IIS7.

Я использую привязку net.tcp и обнаружил, что даже при использовании одностороннего вызова с этой привязкой закрытиепрокси будет блокировать пользовательский интерфейс (в данном случае веб-сайт asp.net) до завершения операции.Я изменил режим передачи на потоковый, чтобы закрытие прокси-сервера не вызывало ожидания, как предложено в этой статье .

Как я уже говорил, это работает, когда я работаю на localhost, нопри развертывании на IIS7 появляется эта ошибка, как только я перехожу на страницу, которая использует метод контракта:

«Режим кадрирования Singleton не поддерживается.»

Если я поменяю атрибут transferMode привязки на 'Buffered' , я не получу сообщение об ошибке, но вернусь к своей первоначальной проблеме закрытия прокси-блока до завершения операции службы

Любая помощь будет принята с благодарностью.

Мой код:

// Operation Contract
[OperationContract(Name = "LoadNewDataset", IsOneWay = true)]
void LoadDataset(Workspace workspace, Connection connection, string dataSetName);

// WCF Config snippets:
<bindings>
  <netTcpBinding>
    <binding name="NetTcpStreamBinding" 
             transferMode="Streamed">
    </binding>
  </netTcpBinding>
</bindings>

....

<endpoint address="DataImportService" binding="netTcpBinding"
  bindingConfiguration="NetTcpStreamBinding" name="DataImportEndpoint"
  contract="MediaBrands.Adroit.WCF.IDataImportService" />


//Website web.config 
<bindings>
  <netTcpBinding>
    <binding name="DataImportEndpoint" closeTimeout="00:10:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:10:00" transferMode="Streamed"
      hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
      maxBufferSize="5242880" maxReceivedMessageSize="5242880">
      <readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
      </security>
    </binding>

....

    <endpoint address="net.tcp://localhost:8001/AdroitWcf/DataImportService"
      binding="netTcpBinding" bindingConfiguration="DataImportEndpoint"
      contract="AdroitServiceReference.IDataImportService" name="DataImportEndpoint">
    </endpoint>

1 Ответ

2 голосов
/ 30 марта 2011

Это потому, что ваш режим безопасности - Сообщение. Соединение должно ждать, пока не будет создан InstanceContext для отправки токена отмены для завершения защищенного сеанса.

Попробуйте установить для режима безопасности значение Нет или Транспорт (в зависимости от ваших потребностей). В качестве альтернативы вы можете передать прокси в ThreadPool.QueueUserWorkItem (ShutItDown, proxy) с некоторым кодом, который выглядит примерно так:

void ShutItDown (данные объекта) { var proxy = (ProxyType) data; proxy.Close (); }

...