从svc.cs文件

时间:2017-03-19 09:25:03

标签: c# asp.net .net wcf

我在项目中有一个WCF服务。 我有一个网络项目,里面有我的svc& svc.cs文件。

我的WCF服务已经写在不同的项目中,所以我只删除了所有的svc和svc.cs代码,并在我的svc文件中提供了标记,以引用我的WCF服务。

我已经成功托管了我的svc文件,我的WCF函数接收来自客户端的调用。 一切都很好,直到这里。

现在,我的WCF代码也有一些它引发的事件。我希望我的svc文件应该为这些事件提供处理程序。所以我在我的svc.cs文件中的构造函数中提供了这些处理程序。但是,我的svc.cs文件中的构造函数没有命中,因此我的WCF服务引发的事件没有被处理(在我的svc.cs文件中)。

我应该照顾什么?

我必须这样做的原因是因为我的WCF服务托管在控制台应用程序以及Windows服务中。这些主机也为WCF内部成功命中的事件提供处理程序。我应该如何在iis中托管我的WCF呢?

我的Servic1.svc是 -

<%@ServiceHost Language="C#" Debug="true" Service="MyServiceNameSpace.MyService" CodeBehind="Service1.svc.cs"%>

我的Service1.svc.cs是

public class Service1
{
  static Service1()
  {
    //EventHandler1 is of type Func<string, string>
    MyService.EventHandler1 = Service1_EventHandler1;
  }
  static string Service1_EventHandler1(string param1)
  {
    //event handling code
  }
}

1 个答案:

答案 0 :(得分:1)

为了在第一次Web服务调用之前调用服务的构造函数,请提供一个 ServiceHostFactory 来控制服务何时实现:

<%@ServiceHost Language="C#" 
               Debug="true" 
               Service="MyServiceNameSpace.MyService" 
               CodeBehind="Service1.svc.cs"
               Factory="MyNS.MyServiceHostFactory
               %>

然后实施工厂:

public class MyServiceHostFactory : ServiceHostFactory{
 ////////////////////////////////////////////////
 // Service instanciated before first web service call 
 // and making subscription to the event
 ////////////////////////////////////////////////
 private IService1 serviceInstance = new Service1();
 protected override ServiceHost CreateServiceHost(
                                    Type serviceType, 
                                    Uri[] baseAddresses ) {
    ServiceHost host = new ServiceHost(serviceInstance);
    // add the endpoints …
    return host;
 }
}

在上一个示例中,它是一个单例服务。 但 ServiceHostFactory 也可用于每次实例化不同的服务。

此致