自托管服务器中两个WCF服务之间的通信

时间:2013-03-01 10:22:22

标签: c# wcf service self-hosting

在此MSDN article中所述的自托管服务中 有两个服务。

现在我想打电话给另一个。一个做一些数据库相关的东西,另一个提供一些工作。我想在其他服务中使用数据库功能。

我尝试添加服务引用,如下所述:Stackoverflow with similar question 但是我收到了消息:"从地址"下载元数据时出错, 所以添加服务引用是不可能的。

服务本身都在运行和工作,因为我已经从客户端应用程序中使用它们。

这是我想要使用的服务的web.config。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

以下是来自我的自托管服务的App.config中的部分

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>

   <!-- omitted lots of blocks -->

    <services>

      <service name="MyProject.WorkService.GeneralWorkService" behaviorConfiguration="SimpleServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/"/>
          </baseAddresses>
        </host>
        <endpoint address="traceability" binding="basicHttpBinding" name="WorkService" contract="MyProject.Service2.Contracts.IService2"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

      </service>
      <service name="MyProject.DatabaseService.GeneralDatabaseService" behaviorConfiguration="SimpleServiceBehavior">
          <host>
            <baseAddresses>
              <add baseAddress="http://localhost:8000/"/>
            </baseAddresses>
          </host>
          <endpoint address="gateway" binding="basicHttpBinding" name="DatabaseService" contract="MyProject.DatabaseService.Contracts.IDatabaseService"/>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>

    </services>
    <client>
      <endpoint name="Service2EP" address="http://localhost/someWork" binding="basicHttpBinding" contract="MyProject.Service2.IService2">        
      </endpoint>

      <endpoint name="DatabaseServiceEP" address="http://localhost/gateway" binding="basicHttpBinding" contract="MyProject.DatabaseService.IDatabaseService">
      </endpoint>



    </client>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

-update -

我可以使用浏览器窗口查看我的服务

http://localhost:8000

也许还有其他方法可以使用我的服务。我应该使用一些代理吗? 可以使用svcutil生成?

也许有更好的方法。添加服务引用似乎不起作用 我不明白为什么。

3 个答案:

答案 0 :(得分:1)

您确定在要尝试引用的服务的配置中配置了mex端点吗? 如果您还没有,那么服务将不会公开所需的信息(WSDL)来进行服务引用......

答案 1 :(得分:0)

至少有4种可能性:

  • 未定义元数据交换mex端点
  • 未启用元数据交换
  • 您使用了错误的地址
  • 您被某些安全设置阻止

来自There was an error downloading metadata from the address

答案 2 :(得分:0)

终于找到了答案。

必须将端点从自托管app.config复制到服务web.config。

从那时起,对话框中的错误消息(链接“详细信息”在底部) 很有帮助。

只需将服务行为添加到我已经在自托管app.config中定义的DatabaseService中。

谢谢大家的帮助。会接受W1ck3dHcH的答案,因为它是对的,但我只是没有看到它。