Служба WCF Net.TCP выдает неясные ошибки

Я пытаюсь включить дополнительную конечную точку net.tcp (которая использует аутентификацию имени пользователя) для существующей службы WCF. Служба размещена в IIS7.

Выполнение клиента для службы возвращает ошибку о том, что соединение сокета было прервано. Включение трассировки службы показывает, что возникает следующее исключение:

System.ArgumentOutOfRangeException
Значение этого аргумента должно быть положительным.
Имя параметра: maxAccepts
Фактическое значение: 0.

Я в замешательстве, потому что, насколько я могу судить, совместное использование портов должно быть отключено конфигурацией (см. ниже), но оно все еще звонит через код совместного использования портов (опять же, насколько я могу судить). В любом случае я не могу найти способ указать это значение maxAccepts; Google ничего об этом не знает, и значение maxPendingAccepts, похоже, этого не знает. Как устранить ошибку?

Файл конфигурации службы содержит следующее для конечной точки net.tcp:

<bindings>
  <customBinding>
    <binding name="netTcp">
      <security authenticationMode="UserNameOverTransport" />
      <windowsStreamSecurity />
      <tcpTransport portSharingEnabled="false" listenBacklog="10" maxPendingAccepts="10" maxPendingConnections="10" />
    </binding>
  </customBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="netTcp">
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceMetadata/>
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Asi.Soa.ServiceModelEx.NullUserNamePasswordValidator, Asi.Soa.ServiceModelEx" />
        <clientCertificate>
          <authentication certificateValidationMode="None"/>
        </clientCertificate>
      </serviceCredentials>
      <serviceAuthorization principalPermissionMode="Custom">
        <authorizationPolicies>
          <add policyType="Asi.Soa.ServiceModelEx.ClaimsAuthorizationPolicy, Asi.Soa.ServiceModelEx" />
        </authorizationPolicies>
      </serviceAuthorization>
    </behavior>
  </serviceBehaviors>
</behaviors>

Полная трассировка стека исключений:

System.ServiceModel.Channels.ConnectionAcceptor..ctor(IConnectionListener listener, Int32 maxAccepts, Int32 maxPendingConnections, ConnectionAvailableCallback callback, ErrorCallback errorCallback)
System.ServiceModel.Channels.ConnectionDemuxer..ctor(IConnectionListener listener, Int32 maxAccepts, Int32 maxPendingConnections, TimeSpan channelInitializationTimeout, TimeSpan idleTimeout, Int32 maxPooledConnections, TransportSettingsCallback transportSettingsCallback, SingletonPreambleDemuxCallback singletonPreambleCallback, ServerSessionPreambleDemuxCallback serverSessionPreambleCallback, ErrorCallback errorCallback)
System.ServiceModel.Channels.SharedTcpTransportManager.CreateConnectionDemuxer()
System.ServiceModel.Channels.SharedTcpTransportManager.OnDuplicatedVia(Uri via, Int32&amp; connectionBufferSize)
System.ServiceModel.Channels.SharedConnectionListener.SharedListenerProxy.HandleOnVia(DuplicateContext duplicateContext)
System.ServiceModel.Channels.SharedConnectionListener.SharedListenerProxy.System.ServiceModel.Activation.IConnectionDuplicator.BeginDuplicate(DuplicateContext duplicateContext, AsyncCallback callback, Object state)
AsyncInvokeBeginBeginDuplicate(Object , Object[] , AsyncCallback , Object )
System.ServiceModel.Dispatcher.AsyncMethodInvoker.InvokeBegin(Object instance, Object[] inputs, AsyncCallback callback, Object state)
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Dispatch(MessageRpc&amp; rpc, Boolean isOperationContextSet)
System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result)
System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
System.ServiceModel.Channels.FramingDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)
System.ServiceModel.Diagnostics.Utility.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)
System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
System.ServiceModel.Channels.TracingConnection.TracingConnectionState.ExecuteCallback()
System.ServiceModel.Channels.TracingConnection.WaitCallback(Object state)
System.ServiceModel.Channels.PipeConnection.OnAsyncReadComplete(Boolean haveResult, Int32 error, Int32 numBytes)
System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Изменить: я установил компоненты активации WCF, отличные от HTTP, запустил ServiceModelReg.exe, добавил net.tcp и net.pipe в список включенных протоколов в диспетчере IIS и т. д. Никакой радости.

Я также написал быструю службу Windows для размещения службы (не идеальное долгосрочное решение для нас), и соединение Net TCP работает там нормально, поэтому в моей конфигурации или коде нет ничего, что означает, что что-то не так в/с IIS. Должен ли пул приложений для приложения работать в интегрированном режиме? Я пробовал оба способа, похоже, это не имело значения, но наше приложение в настоящее время установлено в классическом режиме.


person technophile    schedule 16.02.2010    source источник


Ответы (2)


Насколько я могу судить, проблема просто в том, что .NET не любит размещать две службы в одном и том же приложении IIS, когда одна является конечной точкой Soap11, а другая — конечной точкой NetTcp. Удаление конечной точки Soap11 позволяет конечной точке NetTcp работать без ошибок.

Мы перешли к модели, в которой мы используем службу Windows для размещения конечной точки NetTcp и оставили конечную точку Soap11 в IIS.

Если кто-нибудь решит, как разместить службы NetTcp и Soap11 в одном приложении IIS, я был бы рад услышать об этом.

person technophile    schedule 05.03.2010
comment
Также возникает проблема с конечной точкой SOAP и конечной точкой net.pipe на одном хосте IIS. - person Polyfun; 27.05.2014

Net.tcp не работает на IIS7 из коробки, есть ряд вещей, которые необходимо активировать.

См.: http://labs.episerver.com/en/Blogs/Paul-Smith/Dates/2008/6/Hosting-non-HTTP-based-WCF-applications-in-IIS7/

person Shiraz Bhaiji    schedule 16.02.2010
comment
К сожалению, я сделал все, что указано в этой статье, и я все еще получаю сообщение об ошибке. - person technophile; 17.02.2010