WCF服务不能孤立的存在,如何运行呢?WCF 服务宿主程序可以分为两种:1、寄宿在自身进程中(控制台程序)2、寄宿在IIS进程中。
首先来看第一种:
创建一个控制台程序, 然后添加一个wcf服务,项目中会自动添加一个IXXService.cs、XXService.cs和App.config 三个文件,IXXService.cs就是要提供给外界的方法的借口,XXService.cs继承IXXService.cs实现IXXService.cs中定义的方法。
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Wcf服务端
{
// 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
[ServiceContract]
public interface IMyWCFService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// 任务: 在此处添加服务操作
}
// 使用下面示例中说明的数据协定将复合类型添加到服务操作
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Wcf服务端
{
// 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
[ServiceContract]
public interface IMyWCFService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// 任务: 在此处添加服务操作
}
// 使用下面示例中说明的数据协定将复合类型添加到服务操作
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
代码
app.config
代码
写好借口和实现之后就需要控制台程序把这个wcf运行起来
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace WCF服务端程序
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(MyWCFService)))
{
host.AddServiceEndpoint(typeof(IMyWCFService), new WSHttpBinding(), "http://127.0.0.1:9999/mywcf");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/mywcf/metadata");
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.WriteLine("mywcf已经启动,按任意键终止服务!");
};
host.Open();
Console.Read();
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace WCF服务端程序
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(MyWCFService)))
{
host.AddServiceEndpoint(typeof(IMyWCFService), new WSHttpBinding(), "http://127.0.0.1:9999/mywcf");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/mywcf/metadata");
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.WriteLine("mywcf已经启动,按任意键终止服务!");
};
host.Open();
Console.Read();
}
}
}
}
运行之后访问http://127.0.0.1:9999/mywcf/metadata就会看到
第二种寄宿在IIS进程上
首先创建一个web项目,然后在项目中添加wcf服务,此时会生成 IXXService.cs、XXService.svc两个文件,并在web.config中添加
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="WCF绑在IIS.MyWCFonIISBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="WCF绑在IIS.MyWCFonIISBehavior"
name="WCF绑在IIS.MyWCFonIIS">
<endpoint address="" binding="wsHttpBinding" contract="WCF绑在IIS.IMyWCFonIIS" name="wcfoniis">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
相应的在IXXService.cs和XXService.svc定义接口和实现,完成之后,在IIS中新建站点,指向程序所在目录。就可以访问了。
创建完成WCF服务之后,客户端怎样调用?在需要调用的项目中添加服务引用, 之后就可以调用了,以下介绍两种种调用的方式:
1、直接new一个wcf的实例
using (var client = new MyWCFService.MyWCFServiceClient())
{
2、通过服务代理的方式访问
using (ChannelFactory<IMyWCFService> channelFactory = new ChannelFactory<IMyWCFService>(new WSHttpBinding(), "http://127.0.0.1:9999/mywcf"))
{
IMyWCFService proxy = channelFactory.CreateChannel();
using (proxy as IDisposable)
{
Console.WriteLine(proxy.GetData(1));
Console.WriteLine(proxy.GetDataUsingDataContract(new MyWCF客户端程序.MyWCFService.CompositeType()));
Console.Read();
}
wcf入门实例先简单介绍到这里。