无法在地址处公开WCF端点

时间:2014-07-27 18:31:55

标签: c# web-services wcf iis wsdl

问题

我无法通过端点指定的地址公开WCF服务。

示例我的终点地址是:http://localhost:36793/services/main

当我使用Visual Studio托管WCF服务并尝试访问该地址时,我收到了一个http 404错误(未找到)。

我期望能够通过将?wsdl应用到地址的末尾来查看地址的WSDL。

第二个奇怪的是我可以通过在地址中指定SVC来访问该地址。

示例:http://localhost:36793/ServiceManager.svc?wsdl

环境

  • Windows 8.1
  • Visual Studio 2013 Update 1
  • IIS Express通过Visual Studio托管Web服务

思想

有些东西告诉我这可能是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>

2 个答案:

答案 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

您可以从代码中使用每个端点,但地址,合同,绑定,安全性和任何其他方面必须匹配。