是否需要在多个位置定义WCF端点?

时间:2013-11-27 14:41:06

标签: wcf app-config

我有一个带有app.config的VS2012解决方案。我在解决方案中有多个项目。让我们这样定义:
Root.csproj >>启动项目
- > Orders.csproj
- > Customers.csproj
- > Purchasing.csproj

现在,当我向Orders项目添加服务引用时,它会将绑定和端点信息粘贴到Orders.csproj中的app.config中。但是,当我运行应用程序时,我得到了预期的异常:

  

异常:找不到引用的默认端点元素   在ServiceModel客户端中签订'OrderService.IOrderService'   配置部分。这可能是因为没有配置文件   找到您的应用程序,或者因为没有端点元素匹配   这个合同可以在客户元素中找到。

这是因为Root中的app.config不包含绑定/端点配置。我可以轻松地将orders \ app.config中的绑定和端点复制到root \ app.config并成功执行服务方法。我的问题是为什么我必须这样做?有没有办法告诉root \ app.config从orders \ app.config中收集其他端点?如果服务方法成功执行,则添加服务引用并不会自动将绑定和端点添加到root \ app.config,这似乎很愚蠢。任何建议都非常感谢。感谢。

1 个答案:

答案 0 :(得分:1)

有服务器端“端点”.........

但是在客户端........你必须添加一些指向服务器端端点的条目。

要回答您的问题,(否),您必须在客户端定义信息。 它基本上是说“这里是找到你想要使用的服务的地方”

它们看起来非常相似。

服务器端:

<endpoint
      address  = "http://localhost:8001/MammalControllerFascade"
      binding  = "wsHttpBinding" bindingConfiguration="WSHttpBindingName1"
      contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController" >
</endpoint>

<endpoint
      address  = "net.pipe://localhost/LocalMammalControllerFascade"
      binding  = "netNamedPipeBinding" bindingConfiguration="NamedPipeBindingName1"
      contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController" >
</endpoint>

客户机侧

<client>


    <endpoint name="WSHttpEndPoint"
             address  = "http://localhost:8001/MammalControllerFascade"
             binding  = "wsHttpBinding"  bindingConfiguration="WSHttpBindingName1"
             contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController"  >


    </endpoint >


    <endpoint name="NamedPipeEndPoint"
         address  = "net.pipe://localhost/LocalMammalControllerFascade"
         binding  = "netNamedPipeBinding"  bindingConfiguration="NamedPipedBindingName1"
         contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController"  >
    </endpoint >


</client>

注意,它们是相似的。注意,在客户端,ENDPOINT有一个名称。 这样客户端就可以按名称引用ENDPOINT。

编辑:

您是否同时运行主机和客户端?

您不能只在调试模式下运行客户端。必须启动该服务。

右键单击解决方案,属性..............并设置2个启动项目。 (如果你是自托管的)

如果您不是自我托管.....那么您如何“提供服务器”? (调试期间运行服务器端代码的是什么?)

编辑:

我将“部门信息”存储在不同的文件中。所以我可以维护它们,而不会在同一个app.config(或web.config)中弄乱所有内容。

以下是一个示例:

APP.CONFIG(或web.config)

<system.serviceModel>

    <behaviors configSource="WCFBehaviors.config">
    </behaviors>

    <bindings configSource="WCFBindings.config">
    </bindings>

    <client configSource="WCFClient.config">
    </client>

    <services configSource="WCFServices.config">
    </services>

</system.serviceModel>

我将展示上面的一个文件。

下面看到的“WCFClient.config”的内容。其他文件遵循相同的模式。

<client>

    <endpoint name="WSHttpEndPoint"
             address  = "http://localhost:8001/MammalControllerFascade"
             binding  = "wsHttpBinding"  bindingConfiguration="WSHttpBindingName1"
             contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController"  >


    </endpoint >

    <endpoint name="NamedPipeEndPoint"
         address  = "net.pipe://localhost/LocalMammalControllerFascade"
         binding  = "netNamedPipeBinding"  bindingConfiguration="NamedPipedBindingName1"
         contract = "GranadaCoder.Applications.TrinugWCFDemoVersion1.Interfaces.Controllers.IMammalController"  >
    </endpoint >

</client>