创建WCF 服务时,首先应该定义协定。协定指定服务支持的操作,通过定义接口可创建协定。接口中的每个方法都对应于特定的服务操作。每个接口都必须将ServiceContract特性应用于自身,ServiceContract有两个重要的属性Name:服务的名称和Namespace:命名空间;
如果未指定,则默认的命名空间为http://tempuri.org。每个操作都必须将 OperationContract特性应用于自身。如果接口中的一个方法具有 ServiceContract特性但是并没有OperationContract特,则无法通过该服务访问此方法。
[ServiceContract]
public interface IMyCalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
先以简单示例对WCF有一个初步的认识:
摘自MSDN
开始创建自己的WCF服务
1,首先创建一个控制台应用程序
添加代码:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
return n1 * n2;
}
public double Divide(double n1, double n2)
{
return n1 / n2;
}
}
2,在Main方法下添加如下代码: 注意代码注释行
//创建服务的基础地址,可以设置服务运行端口和IP地址
Uri siteUri = new Uri("http://localhost:8001/ServiceModelSamples/Service");
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService),siteUri))
{
try
{
// 添加公开服务的终结点。必须指定终结点公开的协议、绑定和终结点的地址.
WSHttpBinding binding = new WSHttpBinding();
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "CalculatorService");
//启用元数据交换
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(smb);
// ServiceDescription sd = serviceHost.Description;
// sd.Behaviors.Add();
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
serviceHost.Close();
}
catch (InvalidOperationException ioe)
{
Console.WriteLine(ioe.Message);
Console.ReadLine();
}
catch (TimeoutException timeProblem)
{
Console.WriteLine(timeProblem.Message);
Console.ReadLine();
}
catch (CommunicationException commProblem)
{
Console.WriteLine(commProblem.Message);
Console.ReadLine();
}
}
3,运行效果
使用命令行工具创建客户端代码
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service
5,创建一个客户端控制台应用程序
添加generatedProxy.cs和app.config文件.
在Main方法内添加代码