代码之家  ›  专栏  ›  技术社区  ›  MrFox

找不到WCF基址

  •  1
  • MrFox  · 技术社区  · 14 年前

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

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

    要求:

    • 在现有网站中运行
    • 使用会话
    • 可与Java和尽可能多的.net版本一起操作。
    • 公开元数据(wsdl就足够了)

    • 无法使用IIS
    • 我正在使用.NET4和WCF4。

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

    找不到与绑定为WSHttpBinding的终结点的方案http匹配的基址。注册的基址方案是[]。

    没有与给定地址匹配的协议绑定' http://localhost:8080/Functionality '.

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

     <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 回复  |  直到 14 年前
        1
  •  1
  •   marc_s Hady Salah    14 年前

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

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

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

    所以可能是这样的:

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

    或者你的案子里有什么。

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

    在这种情况下 relativeAddress= 成为服务地址(在此虚拟目录中) web.config 所以你的服务地址应该是:

    http://MyServer:7777/ExistingWebApp/MyService
    

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

        2
  •  1
  •   MrFox    14 年前

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

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

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