找不到WCF基址

时间:2010-07-14 09:14:16

标签: wcf web

我的服务可以使用普通的WCF调用,但是要公开元数据(wsdl文件),我必须以正常WCF主机失败的方式更改配置。

我花了无数个小时在谷歌试图解决这个,大问题是在网站内托管服务从未被讨论过(是的,这是不同的)。

要求:

  • 在现有网站上运行
  • 使用会话
  • 可以使用Java和尽可能多的.net版本。
  • 公开元数据(wsdl就够了)

编辑:

  • 无法使用IIS
  • 我正在使用.NET 4和WCF 4。

在此配置中,可以访问元数据(通过wsdl文件),但在尝试托管正常的wcf端点时,我得到了InvalidOperationException:

找不到与绑定WSHttpBinding的端点的scheme http匹配的基址。注册的基地址方案是[]。

因此忽略基地址。

但是当我向端点提供完整地址(只需复制当前地址前的基地址)时,正常的WCF调用工作正常,但在尝试访问元数据时,我收到以下错误: 没有协议绑定与给定地址“http://localhost:8080/Functionality”匹配。

协议绑定在IIS或WAS配置中的站点级别配置。

这是web.config serviceModel部分,我做了一个小测试网站只是为了测试这个,但如果你发送给我一个下午,我会通过电子邮件发送它,这将是很多。给你。

 <system.serviceModel>
  <services>
   <service behaviorConfiguration="metadataSupport" name="MyStuff.TestWithMetadata">
    <endpoint address="Functionality" binding="wsHttpBinding" name="FunctionalityBinding"
     contract="MyStuff.ITestWithMetadata" />
    <host>
     <baseAddresses>
      <add baseAddress="http://localhost:8080/" />
     </baseAddresses>
    </host>
   </service>
  </services>
  <behaviors>
   <endpointBehaviors>
    <behavior name="metadataSupport">
     <webHttp />
    </behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior name="metadataSupport">
     <!--Navigate with browser to httpGetUrl for the wsdl file-->
     <serviceMetadata httpGetEnabled="true" httpGetUrl="Metadata" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="false">
   <serviceActivations>
    <add relativeAddress="TestWithMetadata.svc" service="MyStuff.TestWithMetadata" />
   </serviceActivations>
  </serviceHostingEnvironment>
 </system.serviceModel>

如果有人对如何解决这个问题有任何想法,请帮忙。

2 个答案:

答案 0 :(得分:1)

当您在IIS中托管您的服务时(我假设您的要求“在现有网站中运行”),那么配置中的基地址没有实际意义 - 它根本不会被使用。

在IIS中托管时,您的服务地址由以下内容确定:

  • 您的服务器名称
  • 可能是端口号
  • * .svc文件所在的虚拟目录(及其子目录)
  • * .svc文件本身(包括扩展名)

所以它可能是这样的:

http://MyServer:7777/ExistingWebApp/TestWithMetadata.svc

或者你在案件中的任何内容。

您似乎正在使用.NET 4和WCF 4(从未提及过.....),在这种情况下,您可以通过调整配置条目来完全跳过* .svc文件:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false">
    <serviceActivations>
        <add relativeAddress="MyService" service="MyStuff.TestWithMetadata" />
    </serviceActivations>
</serviceHostingEnvironment>

在这种情况下,relativeAddress=的值将成为服务地址(在此web.config所在的虚拟目录中) - 因此您的服务地址将类似于:

http://MyServer:7777/ExistingWebApp/MyService

在这种情况下根本不需要* .svc文件。

答案 1 :(得分:1)

原来我应该使用httpGetUrl链接来获取元数据,而不是.svc文件,可以忽略基址。

我还将这些测试内容移到了实际的网站上,并且在加载零端点时遇到了大量问题。这是由serviceActivations中的服务引用未设置为完整服务名称(需要包含命名空间)引起的。

我接受了马克的答案,因为他确实帮助了我,并防止这个问题突然出现。