我是照书上代码抄的
服务-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
服务-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
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货