开发者

WCF Windows Service. Can connect locally, but not remotely

开发者 https://www.devze.com 2023-01-11 18:43 出处:网络
I spent two days trying to figure this out and I am stumped.I have a WCF servers running as a service on Windows.A client can connect to it on the same machine, but as soon a开发者_JS百科s I move try

I spent two days trying to figure this out and I am stumped. I have a WCF servers running as a service on Windows. A client can connect to it on the same machine, but as soon a开发者_JS百科s I move try to connect to the service from another machine I cant.

So if the client and host are on the same machine, no problems. If the Host and Client are on separate machines I get exceptions errors.

Here is the weird part, I can use the svcutil to generate the app config and proxy.cs files from a remote machine, but as soon as I call the function it spits errors.

Could not connect to net.tcp://ipaddress:port/Service1. TCP Error code 10061. NO connection could be made because the target machine actively refused it.

If I call it from the same machine Host / Client no errors.

Any ideas?

Updated:

Here is the service end point settings.

<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>

I have tried everything.

Any ideas?

Again is the client and host are on the same machine everything is fine, as soon as I put the client on a different computer, no dice...

I have never had this much headache with network programming back in the day...

Thanks


If Windows Firewall is enabled on the host machine, try disabling it (you can get there through Control Panel). If it works then, you've found the culprit. You'll need to add an exception for your service in the firewall configuration and reenable it.

Same holds if you are using any other 3rd party firewall software, as is often bundled with antivirus software.

edit:

To set no security over TCP, you can use the constructor in code:

var binding = new NetTcpBinding(SecurityMode.None);

or you can do it in the configuration XML:

<netTcpBinding>
    <binding name="myTcpBinding">
        <security mode="None" />
…


I was having the same problem "...everything OK if the client and host are on the same machine, but if the Host and Client are on separate machines I get exceptions errors".

This is what solved the problem for me: My internet connection settings used a proxy server. I changed the IE options for the LAN settings to Bypass proxy server for local addresses and Do not use proxy server for addresses beginning with: http:\\host-ip-here


Is the WCF service actively listening on that port? You should be able to tell by running from the cmd line:

netstat -a -n -p TCP

It should show that a process is listening on 192.168.1.75:8523

If it does, then have you tried enabling WCF trace logging? To enable that, you would add something like this to your 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>

Then attempt your connection and see if "C:\MyApp.svclog" was created, and if it shows any errors. If you have VisualStudio installed on the given machine, then the ".svclog" file should be able to be opened by just double-clicking it.


EDIT: Sorry, I missed in the comments above that you had already enabled trace logging. At least you know WCF is getting the oncoming message. I've never seen your particular error before though, sorry.


On server side I did this and it works:

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

精彩评论

暂无评论...
验证码 换一张
取 消