WCF控制台应用程序独立/独立服务

时间:2011-03-08 20:52:52

标签: .net wcf windows-services

好。我想要创建一个WCF服务的概念问题。简而言之,我需要创建一个独立的Windows服务,为我提供远程处理功能(取代.NET 1.1远程处理应用程序)。

我目前理解的一些一般概念:

  1. 我可以通过首先创建一个提供WCF托管功能的控制台应用程序来完成此任务。
  2. 然后我会通过可用于.NET的“创建服务”机制将此控制台应用程序部署为服务(使用IDE非常简单 - 这部分并不困难)。
  3. 编辑:最好只创建Windows服务并在OnStart()上打开服务主机并在OnStop()中关闭它。我可能会这样做,但我发现的一个令人困惑的事情是,我正在寻找的一些例子谈论编写一个简单的控制台应用程序而不是这个机制....

    这是目前的情况。我们有一个接口,我称之为IData,它实现了对SQL服务器的调用。目前,我们在一个类中实现IData,我将调用RemData,它具有基本的Execute_Query和Execute_NonQuery方法。

    因此,IData看起来像:

    [ServiceContract()]
    public Interface IData
    {
       [OperationContract()]
       int Execute_Query( parameter list....);  // parameter list shouldn't be important here I hope.
    
       [OperationContract()]
       int Execute_NonQuery( parameter list....);
    }
    

    请注意,在我的界面定义中,我添加了WCF内容的属性(Service Contract和OperationContract)。这是我下面的一个问题的核心。

    RemData实现IData。我们将它作为DLL单独构建。

    现在,我需要实现WCF,因此我创建了一个控制台应用程序并包含对DLL的引用,其中包含我的接口IData的定义和对RemData的DLL的引用(是的,它们在我的两个单独的程序集中)。

    这对我来说很棘手。我需要提供服务,所以我想我可以这样做。首先,我修改RemData类并添加System.ServiceModel作为引用,然后使用[ServiceBehavior()]属性修饰类,然后将[OperationBehavior()]属性添加到与我的接口匹配的每个方法。

    1. 这是一个好的攻击计划吗?

    2. 如果我执行此计划,那么我是否使用[ServiceBehavior()]属性装饰该类,然后使用[OperationBehavior()]属性装饰类中的每个方法?我甚至需要OperationBehavior属性吗?我很确定我需要ServiceBehavior属性。

    3. 这些或多或少会匹配界面上的ServiceContract和OperationContract属性,对吗?

    4. 如果我在原始方法中有多个重载的Execute_Query()和Execute_NonQuery()方法怎么办?我知道如何使用OperationContract属性中的Name参数在界面中定义它们:

      [的ServiceContract()] 公共接口IData {    [OperationContract的(名称= “Execute_QueryA”)]    int Execute_Query(参数列表....); //希望参数列表在这里不重要。

      [OperationContract的(名称= “Execute_NonQueryA”)]    int Execute_NonQuery(参数列表....);

      [OperationContract的(名称= “Execute_QueryB”)]    int Execute_Query(参数列表....); //希望参数列表在这里不重要。

      [OperationContract的(名称= “Execute_NonQueryB”)]    int Execute_NonQuery(参数列表....);

      }

    5. 但是,我该怎么做才能实际执行?我只是让[OperationBehavior()]按原样执行,而不是添加任何参数吗?似乎没有名称参数。

    6. 我很欣赏这方面的任何想法或链接到好文章,因为我找不到超出基本的“嘿,我创建了一个在IIS中托管的WCF服务......”的大量有用信息。

      谢谢。

3 个答案:

答案 0 :(得分:1)

  1. 合同定义和实现可以在两个不同的项目(DLL)
  2. 不确定为什么要坚持添加ServiceBehavior和OperationBehavior等属性。如果你没有添加任何行为,最好摆脱它们。
  3. 最好不要使用不同的名称

答案 1 :(得分:0)

您的计划没问题,但您可能不需要使用[OperationBehavior]修饰每个方法实现,除非他们正在做一些特别的事情。

但是,您的重载需要具有唯一的参数,否则您必须为它们指定不同的名称,例如:

[OperationContract()]
int Execute_NonQueryA( parameter list );

[OperationContract()]
int Execute_NonQueryB( parameter list);

OperationContract的name属性并不意味着能够对具有相同C#签名的方法进行多次覆盖,而只是从调用者的角度重命名该方法。

答案 2 :(得分:0)

对于成为独立服务的控制台应用程序,我建议Topshelf适用于我。 关于动态加载WCF服务框架的this codeproject.com文章也很有效。 把它们放在一起就是我要采取的方法。