wcf服务原来是用windows应用程序来自Host的,但是在测试并发的时候发现了个问题:“即使是单调实例加并发模式,方法的调用也不是并发的,而是像队列一样顺序执行的,而且执行的线程的ID都是同一个。”另外一个使用“WCF Service Library”模板创建的WCF服务却可以并发执行。
网上有人说,用Windows应用程序自Host的wcf服务不能并发,用iis或者windows service来Host可以并发。于是改用windows service来Host。
步骤如:“http://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4”所写。
用Windows Service project template创建Windows Service:
public partial class ExchangeWindowsService : ServiceBase
{
ServiceHost host;
public ExchangeWindowsService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Type serviceType = typeof(TradeService);
host = new ServiceHost(serviceType);
host.Open();
}
protected override void OnStop()
{
if(host != null)
host.Close();
}
}
注意:
Type serviceType = typeof(TradeService);
TradeService这里使用类,不能用接口,否则无法启动服务。System.ArgumentException: ServiceHost 仅支持类服务类型。
添加Installer,把Account属性设为LocalUser,因为在本地执行,免去验证的麻烦。
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "WCFWindowsServiceSample";
Installers.Add(process);
Installers.Add(service);
}
}
示例代码来自:“http://msdn.microsoft.com/en-us/library/ms733069(v=vs.90).aspx”
编译后在项目bin/debug目录下会生成abc.exe
在开始菜单的Visual Studio Tools目录下找到VS Commond Prompt,用管理员权限运行,然后cd 到 bin/debug目录
命令 InstallUtil ab.exe来安装服务。用 InstallUtil /u abc.exe来卸载服务。
添加app.config到项目,启动服务后方法能够并行执行,并能够看到方法由不同的线程处理的。