2011-03-08 155 views
1

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

一些基本概念,因为我现在理解他们:

  1. 我可以先创建一个控制台应用程序,提供了WCF托管功能做到这一点。
  2. 然后,我会通过可用于.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()]属性添加到与我的界面匹配的每个方法。

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

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

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

  4. 如果我有多个重载Execute_Query()和Execute_NonQuery()方法在原来的(我这样做)会怎么样。我知道如何使用Name参数在OperationContract特性的接口定义它们:

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

    [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 ....);

    }

  5. 但是,什么才是我的实际执行呢?我是否按照原样离开[OperationBehavior()]并且不向其中添加任何参数?似乎没有名称参数。

我会很感激在这个或任何想法链接的好文章,因为我没有找到一大堆有用的信息,超出了基本的“嘿,我创建了托管在IIS单个调用WCF服务...“

谢谢。

回答

0

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

你重载需要有独特的参数,但是,否则你必须给他们不同的名字,如:

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

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

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

+0

是的。每种方法都有不同的签名。我对此讨论保持简单。我只是想确保我有正确的方法。谢谢! – Dan7el 2011-03-08 21:19:55

0

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

1
  1. 合同的定义和实现可以在两个不同的项目(DLL)的
  2. 不知道为什么你被卡住加一样ServiceBehavior和OperationBehavior属性。如果你没有添加行为,最好摆脱它们。
  3. 而不是去过载,你最好用不同的名称