Wcf 从其他项目中引用ServiceContract

Wcf 从其他项目中引用ServiceContract,wcf,visual-studio,architecture,Wcf,Visual Studio,Architecture,我已经搜索了一整天,在这里和其他地方,所以请原谅任何冗余,但是,我正在尝试做我收集的应该是简单的,推荐的方式,架构一个WCF服务 该场景是一个服务,服务于多个ServiceContract,每个都在它自己的项目中 我从简单开始;在我的解决方案中,我有一个WCF服务库和一个类库,只有一个默认配置文件 我在解决方案中还有另一个项目,名为WCF\u Sandbox.Greeting。程序集名称为WCF_Sandbox.Greeting.dll 在该项目中,有一个类IGreeting(装饰为Servic

我已经搜索了一整天,在这里和其他地方,所以请原谅任何冗余,但是,我正在尝试做我收集的应该是简单的,推荐的方式,架构一个WCF服务

该场景是一个服务,服务于多个ServiceContract,每个都在它自己的项目中

我从简单开始;在我的解决方案中,我有一个WCF服务库和一个类库,只有一个默认配置文件

我在解决方案中还有另一个项目,名为
WCF\u Sandbox.Greeting
。程序集名称为WCF_Sandbox.Greeting.dll

在该项目中,有一个类IGreeting(装饰为ServiceContract)和一个实现类Greeting

我真的很难通过
WCF\u沙盒
服务获得
SayHello()
IGreeting
方法

我不断地得到

“此服务未列在由…实现的服务中”

错误,或者

没有可用的元数据

如果有人能建议如何从这个其他项目中获得服务,使其出现在WCF_沙盒服务中,我将不胜感激。这似乎是很多人都在努力解决的一个基本问题,而我还没有看到它在任何地方以一种直截了当的方式得到回答。非常感谢

app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<services>
  <service name="WCF_Sandbox.Service1">
    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WCF_Sandbox/Service1/" />
      </baseAddresses>
    </host>
    <endpoint address="" binding="basicHttpBinding" contract="WCF_Sandbox.IService1">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
app.config文件。System.Configuration不支持库的配置文件。-->

正如@Tim所提到的,代码可能很有用

我建议采取以下步骤:

1) 。确保项目引用(@Tim建议)-我想你已经做到了

2) 。也许我错了,但如果您的服务契约是IGreeting,那么端点应该包含IGreeting而不是Service1,看起来像

。。。端点地址=“binding=”basicHttpBinding” contract=“WCF\u沙箱.IGreeting

3) 。确保合同属性具有完整的限定接口名称(即完整的命名空间+接口名称)


4) 。尝试使用WCF配置工具(可从Visual studio工具->菜单中获得)手动选择您的合同,然后查看您的配置文件。

我想我理解您试图实现的目标-您希望通过库将服务与其他代码分离-这很好,但我认为您有一些基本的误解。我不确定你的总体经验水平,所以如果我说的话你已经知道或理解,请原谅我

首先,库不是可执行代码。使用库(我知道)的唯一方法是让正在执行的程序使用它。它们提供了一种在多个应用程序之间共享代码的方法,而不需要源代码的多个副本。在WCF术语中,这是一种将合同与托管应用程序分离的方法

因此,在您的情况下,听起来您已经创建了库(顺便说一句,WCF服务库是一个类库-它只是一个不同的项目模板,可以让您启动并运行WCF)

接下来需要做的是托管服务。您可以通过IIS、Windows服务或自托管应用程序执行此操作。例如,如果您打算在IIS中托管服务,则应将包含服务的库(DLL)放在您计划托管服务的虚拟目录/应用程序的bin文件夹中。然后,您将在虚拟目录/应用程序的根目录中为服务添加一个*.svc文件,并将ServiceModel节从默认的app.config文件复制到web.config文件

要使用该服务,您可以通过VisualStudio(在将使用该服务的项目中)添加服务引用,也可以通过SvcUtil生成代理并将其包含在客户机项目中

简言之,如果我正确理解了您的设置,您已经成功了。您只需要托管服务,然后编写一个客户端来使用它

有很多事情我没有在这里讨论过——这只是我认为你正在尝试做的事情的一种方式

我强烈建议浏览微软的——特别是关于托管和创建客户端的部分


我希望这能消除你的一些困惑——WCF有很多不同的选择和口味,非常棒,但它也有一个陡峭的学习曲线。

我想到两件事。首先,您是否引用了这些项目?第二,您是否在托管服务的应用程序中放置了服务模型配置(张贴在您的问题中)?根据发布的配置顶部的注释,您试图将配置直接用于库。另外,你可以发布你的项目是如何组织的吗?这可能对我们也有帮助。@Tim:另一个项目被引用了。将配置放在托管服务的应用程序中?还没有。我的解决方案有一个WCF服务库项目和一个类库。我想在类库中定义servicecontract&implementing类,并让它由WCF服务提供服务。WCF测试客户机不显示类库中的服务,或者我得到一个元数据不可发现的错误,或者我得到一个服务不在项目实现的列表中的错误。我没有在代码中包含端点,这是我希望SO能给我的。@evgenyl-谢谢。我想保持这个简单,现在没有太多的代码发布。如上所述,我想要一个类库来定义接口/ServiceContract和实现类,并让一个单独的服务库从该类中为该契约提供服务。我已经完成了第1和第4步,可能是因为我不知道如何正确完成第2和第3步。这就是为什么我忽略了所有必需的端点。我在发帖之前确实尝试过你的例子,但它不起作用,所以我不确定我有什么错。