在IIS7上托管时,WCF应用程序返回400 Bad Request

时间:2010-07-20 10:08:44

标签: c# iis wcf

我使用C#和Visual Studio 2008编写了一个WCF Web服务。

当我使用内置的开发Web服务器运行它时,我可以通过浏览到服务契约的[WebGet(UriTemplate =“..”)]属性中指定的URL来查看各种方法的结果

具体来说,我有一个匹配“/”URL的方法,并返回一个纯HTML文件。

但是,当我部署到在Windows Server 2008上运行的IIS时,此方法将返回标准“您已创建服务”页面。

如果我尝试使用我指定的URI模板执行任何其他方法,例如:

api.hostname.com/Service.svc/method/param

服务器返回400 Bad Request。

我的live web.config的system.serviceModel部分如下所示:

 <system.serviceModel>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
   <services>
       <service name="RootNamespace.Api.EventService"
           behaviorConfiguration="RootNamespace.Api.EventServiceBehaviour" >
        <endpoint address="" 
                  binding="wsHttpBinding" 
                  contract="RootNamespace.Api.IEventService" />
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
           <add baseAddress="http://api.hostname.com" />
         </baseAddresses>
       </host>
     </service>
   </services>
   <behaviors>
     <serviceBehaviors>
       <behavior name="RootNamespace.Api.EventServiceBehaviour">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
       </behavior>
     </serviceBehaviors>
   </behaviors>
</system.serviceModel>

我想知道请求是否没有达到WCF服务,并且被IIS中的另一个处理程序阻止但是它返回根URL的不同内容这一事实让我怀疑我正在做其他事情这里错了。

...更新

我已经设法通过修改的web.config进行了一些进展:

    

<behaviors>
  <serviceBehaviors>
    <behavior name="RootNamespace.Api.EventServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="WebBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>

<services>
  <service behaviorConfiguration="RootNamespace.Api.EventServiceBehavior"
           name="RootNamespace.Api.EventService">
    <endpoint address="" 
              binding="webHttpBinding" 
              behaviorConfiguration="WebBehavior"                     
              contract="RootNamespace.Api.IEventService">
    </endpoint>
  </service>
</services>

这显然与我的第一次尝试有很大不同,但目标保持不变 - 我想使用Web浏览器导航到我的服务合同(IEventService)的WebGet属性中定义的URL。

使用此Web配置,而不是获得400错误,我现在收到我已定义的方法的403禁止错误。对于不存在的方法,我正确地接收到“未找到端点”消息。这让我觉得我的东西运行正常,但我只是在应用层遇到了某种身份验证问题。

我也觉得我让这太复杂了。毕竟,这在Visual Studio Web服务器中没有任何配置。

1 个答案:

答案 0 :(得分:0)

我认为你的问题是:

  • 如果您启用了服务元数据并且配置中包含httpGetEnabled=true(并且您确实如此),则点击基地址(baseAddress="http://api.seetickets.com")将呈现元数据“您有一个服务“页面。这是默认的WCF行为。

  • 你有一个“生活”在同一地址的介绍html页面 - &gt;你有冲突

你可以做两件事:

  • 停用服务元数据上的httpGetEnabled

或:

  • 将您的简介页面移至另一个地址,例如http://api.seetickets.com/intro或其他内容(通过在服务方法上设置UriTemplate="....."