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