如何为每个请求停止重新创建WCF服务?

时间:2014-08-12 18:47:20

标签: c# .net wcf

我有一个需要运行的服务来管理长时间运行的后台任务。我通过WCF托管这项服务,但我遇到了一个问题,即每次后续的Web请求都会不断创建和销毁服务。

这是服务:

[ServiceContract]
public interface IFileProcessService 
{
    [OperationContract]
    [WebInvoke(UriTemplate = "ProcessFile?s={session}&file={fileName}", BodyStyle = WebMessageBodyStyle.Bare)]
    int ProcessFile(int session, string fileName);
}

public class FileProcessService : IFileProcessService
{
    private FileProcessTaskScheduler mTaskScheduler;
    private TaskFactory mTaskFactory;

    private FileProcessService()
    {
        mTaskScheduler = new FileProcessTaskScheduler(4);
        mTaskFactory = new TaskFactory(mTaskScheduler);
    }

    public int ProcessFile(int scriptRunId, string fileName)
    {
        return mTaskFactory.StartNew(() =>
        {
            Console.WriteLine("Processing file {0} for script run {1}", fileName, scriptRunId);
            Thread.Sleep(TimeSpan.FromMinutes(1));
            Console.WriteLine("Completed processing file {0} for script run {1}", fileName, scriptRunId);
        }).Id;
    }
}

显然,当TaskScheduler和TaskFactory在每个请求结束时被处理掉时,它并没有真正起作用。

主要是我主持这样的服务:

WebServiceHost host = new WebServiceHost(typeof(FileProcessService), new Uri("http://localhost:7343/"));
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.HttpHelpPageEnabled = false;

ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IFileProcessService), new WebHttpBinding(), "");

host.Open();
Console.WriteLine("Service is now running...");
Console.ReadKey();
host.Close();
Console.WriteLine("Service has stopped...");

我已经尝试将服务的成员设置为static,然后使用if检查将它们的实例化包装在构造函数中,但在那时我认为编写一个单独的单例类来处理这些东西会更简洁。

WCF WebServiceHost似乎将它作为单例托管的服务实例引用,但它肯定不会这样对待它。我是否需要采取一些额外的步骤来使WebServiceHost在每次请求后都不处理我的对象?

1 个答案:

答案 0 :(得分:4)

查看ServiceBehaviorAttribute InstanceContextMode

您可以看到此类WCF服务here的工作示例,this是代码中使用的地方。