多看多练,慢慢入门。今天将学习的wcf中实现重载进行梳理一遍。直接上代码和注意事项吧,多的我也解释不清,去看大佬的博客。他们说的更详细。
最简单的三层结构,Client用直接服务引用的方法实现,ClientByConfig用重写服务端+配置文件的方法实现的。

服务端代码:
就是普通的服务接口,里面两个名字相同的方法,然后用在上面加特性用于区分两个方法。
[ServiceContract]
public interface IService1
{
[OperationContract(Name="AddInt")]
int Add(int num1, int num2);
[OperationContract(Name="AddDouble")]
double Add(double num1, double num2);
// TODO: 在此添加您的服务操作
}
服务实现:
public class Service1 : IService1
{
public int Add(int num1, int num2)
{
return num1 + num2;
}
public double Add(double num1, double num2)
{
return num2 + num1;
}
}
寄宿代码和配置文件
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Service1)))
{
host.Opened += delegate
{
Console.WriteLine("CalculatorService已经启动!");
};
//通讯状态转换到已打开
host.Open();
Console.ReadLine();
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服务库项目时,必须将配置文件的内容添加到
主机的 app.config 文件中。System.Configuration 不支持库的配置文件。 -->
<system.serviceModel>
<services>
<service name="Service.Service1" behaviorConfiguration="Service.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/Design_Time_Addresses/Service/Service1/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址相对于上面提供的基址-->
<endpoint address="http://192.168.10.2:8733/Design_Time_Addresses/Service/Service1/" binding="basicHttpBinding" contract="Service.IService1">
<!--
部署时,应删除或替换以下标识元素,以反映
在其下运行部署服务的标识。删除之后,WCF 将
自动推导相应标识。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除 -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Service.Service1Behavior">
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前
设置为 false 可避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
服务端就这些东西,跟平时用的都差不多,就是多了个特性,用来区分两个方法。下面介绍客户端的两种实现方法。
第一种:
直接应用,就是直接服务启动以后,直接添加服务引用,这样生成以后可以更直观的看到里面的内容区分。
直接引用会自动生成一个配置文件 ,这个就不贴出来了。
自己点开看看,区别在哪里。 这两个其实就是你前面写的特性的名字,客户端引用以后被重写了。
控制台代码:
static void Main(string[] args)
{
Service1Client service = new Service1Client();
Console.WriteLine("结果:{0}",service.AddInt(12, 12));
Console.Read();
}
第一种方法就结束了,可以很清楚的看到,类似于把服务端的方法进行了重写。重写的方法名就是特性上面的名称。
第二种:
第二种其实更简单,或者说更符合C#的那种。类似于把服务端重写一遍,但是有区分,新手一定要注意。这个名字的指向还是服务端的名称。这个接口重新起个名字。
服务实现:
public class MyServiceClient : ClientBase<ImyService>, ImyService
{
public int Add(int num1, int num2)
{
return Channel.Add(num1, num2);
}
public double Add(double num1, double num2)
{
return Channel.Add(num1, num2);
}
}
创建客户端配置文件:
我不是创建的,我是把上个方法自动生成的拷贝过来的,然后有个地方要进行修改。这个一定要对应为客户端的服务,不然会报错。
控制台代码:
static void Main(string[] args)
{
MyServiceClient serviceClient = new MyServiceClient();
Console.WriteLine("结果:{0}", serviceClient.Add(12,12));
Console.Read();
}
这就结束了。得到的结果其实是一样的,第二种方法貌似更符合以前的那种方式,因为方法的名字并没有被修改,只要传入不同的参数就能识别。建议使用第二种。源代码,自己写的也是为了挣点积分,以后学习别人的能用的,有大佬的话,送点积分,哈哈。