是否可以运行他们键入的ServiceHost具有通用?

时间:2012-07-20 15:53:23

标签: c# wcf generics app-config servicehost

例如

        // Create a ServiceHost for the Service type and 
        // provide the base address.
        mServiceHost = new ServiceHost(typeof(T));

        // Open the ServiceHostBase to create listeners and start 
        // listening for messages.
        mServiceHost.Open();

在这种情况下,T是TransactionProcessingService。

到目前为止,我收到了app config的错误,不知道应该如何修改它:

  

服务   “TransactionProcessingWindowsService.TransactionProcessingService`1 [[Common.TransactionProcessing,   Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'has   零应用(非基础设施)端点。这可能是因为   找不到您的应用程序的配置文件,或者没有找到   匹配服务名称的服务元素可以在   配置文件,或者因为没有定义端点   服务要素。

以下是我尝试设置配置的方法

      <service name="TransactionProcessingWindowsService.TransactionProcessingService&lt;TransactionProcessingWindowsService.TransactionProcessing&gt;"
           behaviorConfiguration="TransactionProcessingServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8000/TransactionProcessingService/service"/>
      </baseAddresses>
    </host>
    <endpoint address=""
              binding="wsHttpBinding"
              contract="TransactionProcessingWindowsService.ITransactionProcessingService" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>

由于

3 个答案:

答案 0 :(得分:1)

异常详细信息显示应使用的服务名称。试试这个:

<service name="TransactionProcessingWindowsService.TransactionProcessingService`1[[Common.TransactionProcessing, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"
         behaviorConfiguration="TransactionProcessingServiceBehavior">

但这并不酷,因为每次更改程序集版本或签名时都需要更新配置文件。

答案 1 :(得分:0)

您的配置文件具有ITransactionProcessingService的端点,但不包含TransactionProcessingService的端点。

因为你使用的是泛型,所以T可以是任何东西(或者你限制它的任何东西)。但是你需要为你用作T的任何东西定义一个端点。

我建议使用界面而不是通用界面。

答案 2 :(得分:0)

所以,我正在尝试通用,因为我已经有了一个接口,但需要一个通用功能的公共基类。所以,我正在尝试这个:

public class TransactionProcessingService<T> : ITransactionProcessingService where T : BaseProgram

因为我想拥有BaseProgram的常用功能和属性。我无法继承2个接口或接口和类,因为我只能有一个wsHttpBinding绑定端点。我最终回到了

public class TransactionProcessingService : ITransactionProcessingService

public class MyServiceBase<T, U> : ServiceBase where U : BaseProgram, new()

其中MyServiceBase提供了一个静态属性,它只提供对U的静态实例中属性的访问。

private static U mProcess;
protected ServiceHost mServiceHost = null;
public static int StatusCheckFrequency
{
    get { return mProcess.StatusCheckFrequency; }
    set { mProcess.StatusCheckFrequency = value; }
}

这是有效的,因为我只打算在一台机器上运行每个服务的一个实例。

我会给ie。答案是因为它似乎回答了我的问题,即使我最终没有尝试过它。