开发者

wcf duplex service issue

i am new to WCF, i try to create a duplex service and i get an exception with this messge "HTTP could not register URL http://+:80/Temporary_Listen_Addresses/42be316a-0c86-4678-a61a-fc6a5fd10599/ because TCP port 80 is being used by another application." I will post the whole code in here and i hope you have time to take a look. I am using Windows XP.

Service

namespace WcfService
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(RandomService));
            host.Open();
            Console.WriteLine("Service is running, press <ENTER> to stop it");
            Console.ReadLine();
            host.Close();
        }
    }
    public class RandomService : IRandomService
    {
        public void GenerateRandomNumber(int limit)
        {
            Random r = new Random();
            int genInteger = r.Next(limit);
            Thread.Sleep(3000);
            IRandomCallback callback = OperationContext.Current.GetCallbackChannel<IRandomCallback>();
            callback.ShowRandomNumber(genInteger);
        }
    }
    public interface IRandomCallback
    {
        [OperationContract(IsOneWay = true)]
        void ShowRandomNumber(int ranomNumber);
    }
    [ServiceContract(CallbackContract = typeof(IRandomCallback))]
    public interface IRandomService
    {
        [OperationContract(IsOneWay = true)]
        void GenerateRandomNumber(int limit);
    }
}

Config file

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfService.RandomService" behaviorConfiguration="randomConfig">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:6789/random/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsDualHttpBinding" contract="WcfService.IRandomService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="randomConfig">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Client

class Program
    {
        static void Main(string[] args)
        {
            InstanceContext context = new InstanceContext(new RandomHandler());
            RandomServiceClient proxy = new RandomServiceClient(context);
            Console.WriteLine("Let's generate a random number");
            try
            {
                proxy.GenerateRandomNumber(100);
            }
            catch (AddressAlreadyInUseException exception)
            {
                Console.WriteLine(exception.Message);
            }
            Console.WriteLine("Press <ENTER> to exit");
            Console.ReadLine();
        }
    }
    public class RandomHandler : I开发者_Python百科RandomServiceCallback
    {
        public void ShowRandomNumber(int ranomNumber)
        {
            Console.WriteLine("Generated number:{0}", ranomNumber);
            Console.ReadLine();
        }
    }

Config file -> generated using svcutil.exe

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsDualHttpBinding>
                <binding name="WSDualHttpBinding_IRandomService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                    <security mode="Message">
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" />
                    </security>
                </binding>
            </wsDualHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:6789/random/" binding="wsDualHttpBinding"
                bindingConfiguration="WSDualHttpBinding_IRandomService" contract="IRandomService"
                name="WSDualHttpBinding_IRandomService">
                <identity>
                    <userPrincipalName value="BOGUS\Bogdan" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>


It's probably being caused because something else is already listening on port 80. Quite often it's IIS running on the same machine. It can also be caused by the WCF Test Client being started if you run the program from Visual Studio and have also created your own service host.

Take a look at this link for some hints. The comments at the bottom of this article also have some suggestions. And one more link here.


Instead of hosting the service in a console application i created a wcf service and in the client application config i added a clientBaseAddress for the binding

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜