Служба WCF, использующая дуплексный канал в разных доменах - PullRequest
0 голосов
/ 22 апреля 2009

У меня есть служба WCF и клиент Windows. Они взаимодействуют через дуплексный канал WCF, который, когда я запускаю из одного сетевого домена, работает нормально, но когда я помещаю сервер в отдельный сетевой домен, я получаю следующее сообщение в следе сервера WCF ...

Сообщение с

net.tcp: // а: 8731 / ActiveAreaService / MEX / MEX ' не может быть обработано в приемнике, из-за несоответствия AddressFilter в EndpointDispatcher. Проверь это отправитель и получатель EndpointAddress согласен.

Итак, похоже, что коммуникация просто работает в одном направлении (от клиента к серверу), если компоненты находятся в двух отдельных доменах.

Домены сети полностью доверяют, поэтому я немного озадачен тем, что еще может вызвать это?

Сервер app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="JobController.ActiveAreaBehavior">
                    <serviceMetadata httpGetEnabled="false" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="JobController.ActiveAreaBehavior"
                     name="JobController.ActiveAreaServer">
                <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://SERVER:8731/ActiveAreaService/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>

</configuration>

но я также добавляю конечную точку программно в Visual C ++

host = gcnew ServiceHost(ActiveAreaServer::typeid);

NetTcpBinding^ binding = gcnew NetTcpBinding();
binding->MaxBufferSize = Int32::MaxValue;
binding->MaxReceivedMessageSize = Int32::MaxValue;
binding->ReceiveTimeout = TimeSpan::MaxValue;

binding->Security->Mode = SecurityMode::Transport;
binding->Security->Transport->ClientCredentialType = TcpClientCredentialType::Windows;

ServiceEndpoint^ ep = host->AddServiceEndpoint(IActiveAreaServer::typeid, binding, String::Empty); // Use the base address

Клиентский app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IActiveAreaServer" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://SERVER:8731/ActiveAreaService/"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IActiveAreaServer"
                contract="ActiveArea.IActiveAreaServer" name="NetTcpBinding_IActiveAreaServer">
                <identity>
                    <userPrincipalName value="user@SERVERDOMIAIN.CLIENTDOMAIN.COM" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Любая помощь приветствуется!

Приветствия

Ответы [ 2 ]

0 голосов
/ 01 мая 2009

Это на самом деле мой вопрос, отправленный одним из моих коллег, странно, я знаю, не спрашиваю, я проверил порты, которые используются для канала обратного вызова, и они, кажется, случайно генерируются в определенном диапазоне. До сих пор я видел 3501, 4595 и несколько других, поэтому я исключил проблему с портом ..

Есть еще мысли?

0 голосов
/ 23 апреля 2009

Если я правильно помню, канал обратного вызова на самом деле происходит на каком-то глупом месте, например на порту 80. Если посмотреть на ваш выбор адреса, я бы поспорил, что между вашими двумя компьютерами есть межсетевой экран, и вы явно открыли порт , Скорее всего, вам придется открыть порт 80.

Я думаю, вы можете настроить это, используя свойство clientBaseAddress привязки, которую вы используете, если порт 80 не ваша чашка чая.

Дайте нам знать, как все прошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...