WCF控制台应用程序支架

好的。 我有一些我想创建的WCF服务的概念性问题。 总之,我需要创建一个独立的Windows服务,为我提供远程处理功能(替换.NET 1.1远程处理应用程序)。

我目前了解他们的一些一般概念:

  • 我可以通过首先创建一个提供WCF托管功能的控制台应用程序来完成此操作。
  • 然后,我将通过可用于.NET的“创建服务”机制将此控制台应用程序部署为服务(使用IDE非常简单 - 这部分并不困难)。
  • 编辑:最好是创建一个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内容(服务合同和OperationContract)的属性。 这是我下面的一个问题的核心。

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

    现在,我需要暗示WCF,所以我创建了一个控制台应用程序,并包含对包含我的接口IData的定义以及对RemData的DLL的引用的DLL的引用(是的,它们位于两个单独的程序集中)。

    这是我的棘手部分。 我需要提供服务,所以我认为我可以这样做。 首先,我修改RemData类并添加System.ServiceModel作为参考,然后使用[ServiceBehavior()]属性修饰类,然后将[OperationBehavior()]属性添加到与我的界面匹配的每个方法。

  • 这是一个很好的攻击计划吗?

  • 如果我按照这个计划做,然后用[ServiceBehavior()]属性修饰类,然后用[OperationBehavior()]属性修饰类中的每个方法? 我甚至需要OperationBehavior属性吗? 不过,我很确定我需要ServiceBehavior属性。

  • 然后这些会或多或少地匹配界面上的ServiceContract和OperationContract属性,对吗?

  • 如果我在原始文件中有多个重载的Execute_Query()和Execute_NonQuery()方法(我会这样做)。 我知道如何使用OperationContract属性中的Name参数在界面中定义它们:

    [ServiceContract()] public Interface IData {[OperationContract(Name =“Execute_QueryA”)] int Execute_Query(parameter list ....); //参数列表在这里我不希望是重要的。

    [OperationContract(Name =“Execute_NonQueryA”)] int Execute_NonQuery(parameter list ....);

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

    [OperationContract(Name =“Execute_NonQueryB”)] int Execute_NonQuery(parameter list ....);

    }

  • 但是,我为实际实施做了什么? 我是否按照原样离开[OperationBehavior()]并且不向其中添加任何参数? 似乎没有名称参数。

  • 我会很感激这方面的任何想法或者链接到优秀的文章,因为我没有发现超出基本内容的大量有用信息“嘿,我创建了一个在IIS中托管的单一调用WCF服务......”

    谢谢。


    你的计划很好,但你可能不需要用[OperationBehavior]来修饰每个方法实现,除非他们做了一些特殊的事情。

    但是,你的重载需要有唯一的参数,否则你必须给它们不同的名字,例如:

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

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


  • 契约定义和实现可以在两个不同的项目(DLL)中
  • 不知道为什么你坚持添加像ServiceBehavior和OperationBehavior这样的属性。 如果你没有添加行为,最好摆脱它们。
  • 不要去超载,你最好用不同的名字

  • 对于成为独立服务的控制台应用程序,我会建议Topshelf适合我。 另外这个关于动态加载WCF服务框架的codeproject.com文章也非常有效。 把它们放在一起是我会采取的方法。

    链接地址: http://www.djcxy.com/p/62573.html

    上一篇: WCF Console Application Stand

    下一篇: Upcasting ServiceContract