我的服务可以使用普通的WCF调用,但是要公开元数据(wsdl文件),我必须以正常WCF主机失败的方式更改配置。
我花了无数个小时在谷歌试图解决这个,大问题是在网站内托管服务从未被讨论过(是的,这是不同的)。
要求:
编辑:
在此配置中,可以访问元数据(通过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>
如果有人对如何解决这个问题有任何想法,请帮忙。
答案 0 :(得分:1)
当您在IIS中托管您的服务时(我假设您的要求“在现有网站中运行”),那么配置中的基地址没有实际意义 - 它根本不会被使用。
在IIS中托管时,您的服务地址由以下内容确定:
所以它可能是这样的:
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中的服务引用未设置为完整服务名称(需要包含命名空间)引起的。
我接受了马克的答案,因为他确实帮助了我,并防止这个问题突然出现。