У меня проблемы с одной службой Wcf, которая есть в приложении. В нем содержится около 150 [OperactionContract]. Теперь я больше не могу Обновить справку по службе в Visual Studio 2008.
Когда я пытаюсь вызвать обновление, я получаю всевозможные странные ошибки, от «Socket Forcically Closed» до «Invalid Type» и другие странные сообщения. Если закомментировать 10-20 операций, все работает нормально.
Я читал всевозможные сообщения здесь, в MSDN и во многих блогах. Все они указывают на конфигурации привязки, которые необходимо изменить, либо в основной привязке, либо в привязке MetadataExchange.
Моя проблема в том, что я пробовал все это, но еще не заставил его работать надежно.
Я самостоятельно размещаю службу в приложении, и это же приложение также является клиентом. У них один и тот же файл конфигурации (в настоящее время), потому что мы находимся в процессе разделения приложения на 2 части с помощью уровня сервиса Wcf.
Вот отрывок, показывающий мои привязки, которые я определил:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IRhinoServices"
closeTimeout="00:05:00"
openTimeout="00:05:00"
receiveTimeout="00:15:00"
sendTimeout="00:05:00"
transactionFlow="false"
transferMode="Buffered"
transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard"
listenBacklog="100"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647"
maxConnections="100"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<reliableSession ordered="true"
inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
</security>
</binding>
</netTcpBinding>
<customBinding>
<binding name="customMex">
<textMessageEncoding>
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</textMessageEncoding>
<tcpTransport transferMode="Buffered"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"/>
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8523/RhinoServices"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IRhinoServices"
contract="RhinoServicesReference.IRhinoServices"
name="NetTcpBinding_IRhinoServices">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
<services>
<service behaviorConfiguration="CounterSketchServer.RhinoServicesBehavior"
name="CounterSketchServer.RhinoServices">
<endpoint address=""
binding="netTcpBinding"
contract="CounterSketchServer.IRhinoServices">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="customBinding"
contract="IMetadataExchange"
name=""
bindingConfiguration="customMex"
listenUriMode="Explicit" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/RhinoServices" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CounterSketchServer.RhinoServicesBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Мне нужно создать прокси-класс, щелкнув ссылку «Обновить службу», которая хорошо работала последние две недели, пока я не достиг этого таинственного предела.
Большинство примеров, которые я видел, разрешают этот разговор о привязках http для mex, но я хотел бы по возможности придерживаться только netTcp, поскольку я сам размещаюсь на хостинге.
Может кто-нибудь мне помочь?
Спасибо.
* ОБНОВЛЕНИЕ *
Я пробовал предложение @Aliostad, и поначалу оно работало хорошо. Пока я не попробовал некоторые из наших вызовов Wcf, которые обновляют элементы пользовательского интерфейса. Это сработало при использовании привязок NetTCP с прокси-классом, созданным инструментом Visual Studios (Добавить ссылку на службу). Но при использовании Channel Factory это не работает.
Я попытался взглянуть на контекст SyncrhonizationContext в книге WCF Ювала, но ничего из того, что я сделал, похоже, не сработало.
Я пробовал использовать как Named Pipes, так и NetTCP в качестве привязки для канала, который я создаю с помощью ChannelFactory, и, похоже, они ведут себя совсем иначе, чем другие, связанные с длительными операциями Wcf, но ни одна из них не работает для обновления элементов пользовательского интерфейса.
Мои службы фактически работают в плагине для движка Rhino 3D CAD, а вызовы ceratin (Render и т. Д.) Запускают обновление пользовательского интерфейса в Rhino. Я предполагаю, что это вызывает проблему с границами потока. Я получаю следующее исключение: попытка чтения или записи в защищенную память
Если у кого-то есть предложения по эффективному использованию метода ChannelFactory в этом сценарии или по устранению моей проблемы со слишком большим количеством операций в данном классе Wcf для создания прокси-сервера службы, я был бы признателен за вашу помощь.
Спасибо!