问题
我无法通过端点指定的地址公开WCF服务。
示例我的终点地址是:http://localhost:36793/services/main
当我使用Visual Studio托管WCF服务并尝试访问该地址时,我收到了一个http 404错误(未找到)。
我期望能够通过将?wsdl应用到地址的末尾来查看地址的WSDL。
第二个奇怪的是我可以通过在地址中指定SVC来访问该地址。
示例:http://localhost:36793/ServiceManager.svc?wsdl
环境
思想
有些东西告诉我这可能是Web服务的配置问题,也可能是IIS中未完全配置的问题。
任何帮助都会非常感激,我花了相当多的时间试图解决这个问题。请参阅下面的Web配置。
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<client />
<services>
<service behaviorConfiguration="MexTypeBehaviour" name="Server.ServiceManager">
<clear />
<endpoint address="Main" binding="basicHttpBinding" name="Main" contract="Server.IServiceManager" />
<endpoint address="Mex" binding="mexHttpBinding" name="Mex" contract="Server.IServiceManager" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:36793/services" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MexTypeBehaviour" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
答案 0 :(得分:1)
如果WCF服务由 IIS 托管,那么*.svc
的位置确实会确定服务网址 - 而不是<host>/<baseAddresses>
或<endpoint>
中的任何设置。
您的服务基础网址为http://yourservername:36793/ServiceManager.svc
- 您无法通过在配置中指定其他内容来更改此内容。
由于您已为服务定义了Main
相对地址,因此您应该可以在
http://localhost:36793/ServiceManager.svc/Main
第二个奇怪的是,我可以通过在地址中指定SVC来访问该地址。
它不是奇怪的 - 这是在WCF中烘焙的IIS托管行为。这是功能 - 不是错误。
如果您希望能够自由定义服务URL,则需要使用自托管,提供控制台应用程序或Windows服务来托管您的WCF服务基础架构。
答案 1 :(得分:1)
我认为您将从visual studio托管该服务,该服务将自动启动IIS express。在IIS中托管服务时,将忽略配置中指定的基址。
.svc文件确定服务的基地址 - Source
定义mex
端点时,您的配置也不正确。
<endpoint address="Mex" binding="mexHttpBinding" name="Mex" contract="Server.IServiceManager" />
IMetadataExchange
端点的合同应为mex
。
配置中的每个端点都不能直接从浏览器访问,例如
http://localhost:36793/ServiceManager.svc/Main
http://localhost:36793/ServiceManager.svc/Mex
您可以从代码中使用每个端点,但地址,合同,绑定,安全性和任何其他方面必须匹配。