一、对于一个WCF服务,经常举例说明的,一般WCF服务里面都是只有一个方法,比如HelloWorld,比如:
public string HelloWorld(string name)
{
return name +" Say:Hello World! Now Time At "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
}
对于宿主(服务器)端来说,承担着发布WCF服务到IIS上,或者提供接口供客户端调用的职责,那么实现也相对比较简单
首先引用WCF服务的命名空间,再在app.config中配置service和behavior,再调用
Console.WriteLine("开始启动服务。。。");
ServiceHost host1 = new ServiceHost(typeof(HelloTimeService.Service1));
host1.Open();
Console.WriteLine("服务已经启动");
Console.ReadLine();
即可。
在客户端调用直接引用service中配置的baseAddress即可。
二、对于WCF服务中有多个服务的情况,可能更加的符合一般要求一些。
首先引用WCF服务的命名空间,再在app.config中配置service和behavior
Console.WriteLine("开始启动服务。。。");
ServiceHost host1 = new ServiceHost(typeof(HelloTimeService.Service1));
host1.Open();
ServiceHost host2 = new ServiceHost(typeof(HelloTimeService.Hello));
host2.Open();
Console.WriteLine("服务已经启动");
Console.ReadLine();
来一个一个的打开
虽然这种方法很不好,但是完全可以符合要求,当然,你也可以通过接口来实现,即定义IService1和IHello来定义方法,再创建一个类来实现这两个接口,那么再通过
Console.WriteLine("开始启动服务。。。");
ServiceHost host = new ServiceHost(typeof(HelloTimeService.Service));
host.Open();
Console.WriteLine("服务已经启动");
Console.ReadLine();
也可以实现,但是这也有一个确定,那就是,实现的这个Service方法的内容将会异常庞大。
所以可以这样实现
/// <summary>
/// 批量启动服务
/// </summary>
public static void StartService()
{
try
{
Configuration myConfiguration = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
ServiceModelSectionGroup myServiceModelSectionGroup = (ServiceModelSectionGroup)myConfiguration.GetSectionGroup("system.serviceModel");
Console.WriteLine("开始启动服务。。。");
string AssemblyStr = ", Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
foreach (ServiceElement element in myServiceModelSectionGroup.Services.Services)
{
Type mytype = Type.GetType(element.Name + ","+ element.Name.Split('.')[0] + AssemblyStr, true, true);
if (mytype == null)
{
throw new Exception("没发现服务:" + element.Name);
}
ServiceHost host = new ServiceHost(mytype);
host.Open();
_hosts.Add(host);
}
Console.WriteLine("服务已经启动");
Console.ReadLine();
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 批量关闭服务
/// </summary>
public static void CloseService()
{
foreach (ServiceHost host in _hosts)
{
host.Close();
}
}
虽然不是很理想,但是功能差不多都可以实现,如果以后有方法再改