У меня проблемы с одним сервисом Wcf, который есть у нас в приложении. В нем около 150 [OperactionContract]. Теперь я не могу Обновление справочника услуг в Visual Studio 2008.
Я получаю всевозможные странные ошибки, варьирующиеся от «принудительно закрытого гнезда» до «неверный тип» и другие странные сообщения, когда я пытаюсь вызвать обновление. Если я закомментирую 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>
Мне нужно иметь возможность сгенерировать прокси-класс, нажав на ссылку «Служба обновления», которая хорошо работала последние 2 недели, пока я не достиг этого таинственного предела.
Большинство примеров, которые я видел, чтобы разрешить этот разговор о привязках http для mex, но я хотел бы придерживаться только netTcp, если это возможно, так как я сам хостинг.
Может кто-нибудь помочь мне?
Спасибо.
* ОБНОВЛЕНИЕ *
Я попробовал предложение @Aliostad, и сначала оно показалось мне удачным. Пока я не попробовал некоторые из наших вызовов Wcf, которые обновляют элементы интерфейса. Это сработало при использовании привязок NetTCP с прокси-классом, созданным инструментом Visual Studios (Add Service Reference). Но при использовании Channel Factory он не работает.
Я пытался просмотреть SyncrhonizationContext в книге WCF Джувала, но ничего, что я делал, казалось, не сработало.
Я пытался использовать как именованные каналы, так и NetTCP в качестве привязки для канала, который я создаю с помощью ChannelFactory, и они, похоже, ведут себя совершенно иначе, чем другие, связанные с длительными операциями Wcf, но ни одна из них не работает для обновления элементов пользовательского интерфейса.
Мои сервисы фактически работают в плагине для движка Rhino 3D CAD, и определенные вызовы (Render и т. Д.) Запускают пользовательский интерфейс в Rhino для обновления. Я предполагаю, что это вызывает проблему границы потока. Исключение, которое я получаю:
попытка чтения или записи в защищенную память
Если у кого-нибудь есть предложения по эффективному использованию метода ChannelFactory в этом сценарии или по решению моей проблемы с использованием слишком большого числа операций в данном классе Wcf для генерации прокси-сервера службы, я был бы признателен за вашу помощь.
Спасибо!