net.tcp与流传输模式绑定=不支持成帧模式Singleton

时间:2011-03-30 18:36:28

标签: .net wcf iis-7 nettcpbinding

我正在尝试在WCF方法中实现fire-and-forget模式。我在本地环境中工作,但在IIS7上运行时遇到问题。

我正在使用net.tcp绑定,并发现即使使用带有此绑定的单向调用,关闭代理也会阻止UI(在本例中为asp.net网站),直到操作完成。我将传输模式更改为流式传输,以便关闭代理不会导致等待,如this article中所示。

正如我所提到的,当我在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 个答案:

答案 0 :(得分:2)

这是因为您的安全模式是Message。连接需要等到InstanceContext完成后才发送取消令牌以结束安全会话。

尝试将安全模式设置为无或传输(根据您的需要)。或者,您可以将代理传递给ThreadPool.QueueUserWorkItem(ShutItDown,proxy),其代码如下所示:

void ShutItDown(object data){   var proxy =(ProxyType)数据;   proxy.Close(); }