Служба Windows WCF. Можно подключиться локально, но не удаленно - PullRequest
6 голосов
/ 14 августа 2010

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

Так что, если клиент и хост находятся на одной машине, проблем нет.Если Хост и Клиент находятся на разных машинах, я получаю ошибки исключений.

Вот странная часть, я могу использовать svcutil для генерации файлов конфигурации приложения и proxy.cs с удаленного компьютера, но как только я вызываю функцию, она выдает ошибки.

Не удалось подключиться к net.tcp: // ipaddress: порт / Service1.Код ошибки TCP 10061. Невозможно установить соединение, так как целевая машина активно отказала ему.

Если я вызываю его с той же машины, хост / клиент без ошибок.

Есть идеи?

Обновлено:

Вот настройки конечной точки службы.

<system.serviceModel>
    <services>
        <service behaviorConfiguration="Service1Behavior" name="WcfServiceLibrary1.Service1">
            <endpoint address="net.tcp://192.168.1.75:8523/Service1" binding="netTcpBinding"
                contract="WcfServiceLibrary1.IService1" />
            <endpoint address="net.tcp://192.168.1.75:8523/mex" binding="mexTcpBinding"
                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://192.168.1.75:8523/" />
                </baseAddresses>
            </host>
        </service>
    </services>
    <bindings>
        <netTcpBinding>
            <binding name = "TcpBindingConfiguration">
                <security mode="None"/>
            </binding>
        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Service1Behavior">
                <serviceMetadata />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Я все перепробовал.

Есть идеи?

Опять же, клиент и хост находятся на одной машине, все в порядке, как только я перевожу клиента на другой компьютер, никаких кубиков ...

Раньше у меня никогда не было такой головной боли с сетевым программированием ...

Спасибо

Ответы [ 4 ]

3 голосов
/ 14 августа 2010

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

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

edit:

Чтобы не устанавливать безопасность по TCP, вы можете использовать конструктор в коде:

var binding = new NetTcpBinding(SecurityMode.None);

или сделать это в XML-файле конфигурации:

<netTcpBinding>
    <binding name="myTcpBinding">
        <security mode="None" />
…
1 голос
/ 11 ноября 2011

У меня была та же проблема "... все в порядке, если клиент и хост находятся на одной машине, но если хост и клиент находятся на разных машинах, я получаю ошибки исключений".

Эточто решило проблему для меня: в моих настройках интернет-соединения использовался прокси-сервер.Я изменил параметры IE для настроек локальной сети на Bypass proxy server for local addresses и Do not use proxy server for addresses beginning with: http:\\host-ip-here

0 голосов
/ 19 октября 2013

На стороне сервера я так и сделал:

var tcpServiceUri = new UriBuilder
            {
                Scheme = Uri.UriSchemeNetTcp,
                Host = LocalIPAddress(),//@"127.0.0.1", //IpAddress,
                Port = int.Parse(_port), //BaseTcpPort,
                Path = @"/SomeService",
            };
_host = new ServiceHost(typeof(SomeService), tcpServiceUri.Uri);

public string LocalIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            localIP = ip.ToString();
            break;
        }
    }
    return localIP;
 }
0 голосов
/ 16 августа 2010

Служба WCF активно прослушивает этот порт?Вы должны быть в состоянии сказать, запустив из строки cmd:

netstat -a -n -p TCP

Это должно показать, что процесс прослушивает 192.168.1.75:8523

Если это так, то вы пыталисьвключить запись трассировки WCF?Чтобы включить это, вы должны добавить что-то вроде этого в ваш app.config:

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
            <listeners>
                <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "C:\MyApp.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

Затем попробуйте подключиться и посмотрите, было ли создано C: \ MyApp.svclog, и показывает ли оно какие-либо ошибки.Если у вас установлен VisualStudio на данном компьютере, файл ".svclog" можно открыть, просто дважды щелкнув по нему.


РЕДАКТИРОВАТЬ: Извините, в комментариях выше я пропустил, чтовы уже включили ведение журнала трассировки.По крайней мере, вы знаете, что WCF получает сообщение.Я никогда раньше не видел твоей конкретной ошибки, извини.

...