我是照书上代码抄的
服务-WCF服务库:
App.config<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到 
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
  <system.serviceModel>
    <services>
      <service name="MyMessageService.MessageService" behaviorConfiguration="MyMessageService.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8000/Design_Time_Addresses/MyMessageService/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address ="" binding="wsDualHttpBinding" contract="MyMessageService.IMyMessage">
          <!-- 
              部署时,应删除或替换下列标识元素,以反映
              在其下运行部署服务的标识。删除之后,WCF 将
              自动推导相应标识。
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- 元数据交换终结点由服务用于向客户端做自我描述。--> 
        <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyMessageService.Service1Behavior">
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false 并删除上面的元数据终结点  -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试, 
          请将下值设置为 true。在部署前 
            设置为 false 以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>IMyMessage.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;namespace MyMessageService
{    public interface IMyMessageCallback
    {
        [OperationContract(IsOneWay = true)]
        void OnCallback(string message);
    }    [ServiceContract(CallbackContract = typeof(IMyMessageCallback))]
    public interface IMyMessage
    {
        [OperationContract]
        void MessageToServer(string message);
    }}MessageService.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading;namespace MyMessageService
{
    public class MessageService : IMyMessage
    {
        public void MessageToServer(string message)
        {
            Console.WriteLine("message from the client: {0}", message);
            IMyMessageCallback callback =
                  OperationContext.Current.
                        GetCallbackChannel<IMyMessageCallback>();            callback.OnCallback("message from the server");            new Thread(ThreadCallback).Start(callback);
        }        private void ThreadCallback(object callback)
        {
            IMyMessageCallback messageCallback = callback as IMyMessageCallback;
            for (int i = 0; i < 10; i++)
            {
                messageCallback.OnCallback("message " + i.ToString());
                Thread.Sleep(1000);
            }
        }
    }
}客户端-控制台应用程序:
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using MyMessageService;
namespace 客户端
{
    class ClientCallback : IMyMessageCallback
    {
        public void OnCallback(string message)
        {
            Console.WriteLine("message from the server: {0}", message);
        }
    }
    class Program
    {
        static void Main()
        {
            try
            {
                Console.WriteLine("Client - wait for service");                WSDualHttpBinding binding = new WSDualHttpBinding();
                EndpointAddress address =
                      new EndpointAddress("http://10.187.202.41:8000/Design_Time_Addresses/MessageService/Service1/");                ClientCallback clientCallback = new ClientCallback();
                InstanceContext context = new InstanceContext(clientCallback);                DuplexChannelFactory<IMyMessage> factory =
                   new DuplexChannelFactory<IMyMessage>(context, binding, address);                IMyMessage messageChannel = factory.CreateChannel();                messageChannel.MessageToServer("From the client");                Console.WriteLine("Client - press return to exit");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }        }
    }
}运行后出错:HTTP 无法注册 URL http://+:80/Temporary_Listen_Addresses/a384dad9-9105-49aa-befa-738ffb6644a5/,因为另一应用程序正在使用 TCP 端口 80。
单向通信时没问题...请问是什么原因...这么长的代码貌似不太受待见...Orz