wcf双工服务问题

时间:2010-06-25 19:41:04

标签: .net wcf

我是WCF的新手,我尝试创建一个双工服务,我得到了一个例外,这个消息“HTTP无法注册URL http://+:80/Temporary_Listen_Addresses/42be316a-0c86-4678-a61a-fc6a5fd10599/,因为另一个应用程序正在使用TCP端口80。” 我将在这里发布整个代码,希望你有时间看看。 我使用的是Windows XP。

服务

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);
    }
}

配置文件

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

客户端

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 : IRandomServiceCallback
    {
        public void ShowRandomNumber(int ranomNumber)
        {
            Console.WriteLine("Generated number:{0}", ranomNumber);
            Console.ReadLine();
        }
    }

配置文件 - &gt;使用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>

2 个答案:

答案 0 :(得分:0)

它可能是由于其他东西已经在端口80上侦听而引起的。通常它是在同一台机器上运行的IIS。如果从Visual Studio运行程序并且还创建了自己的服务主机,则也可能由WCF测试客户端启动。

查看this链接以获取一些提示。 this文章底部的评论也有一些建议。还有一个链接here

答案 1 :(得分:0)

我没有在控制台应用程序中托管服务,而是创建了一个wcf服务,而在客户端应用程序配置中,我为绑定添加了一个clientBaseAddress