IIS 托管的 WCF 服务返回 HTTP 400 错误请求

Posted

技术标签:

【中文标题】IIS 托管的 WCF 服务返回 HTTP 400 错误请求【英文标题】:IIS hosted WCF Service return HTTP 400 Bad Request 【发布时间】:2014-09-11 08:47:35 【问题描述】:

我一直在寻找几个小时,但我找不到解决方案。我简单解释一下。

我正在学习 WCF 服务。我刚刚创建了一个服务并浏览它。这是配置文件:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:2005/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

从 Visual Studio 浏览时似乎没有问题。效果很好。

其次,我正在尝试在 IIS 上发布它。我正在做的是这样的:

我将服务发布到一个文件夹并将该服务添加到 IIS。

我选择了 3006 端口作为端口。

在其配置文件下方。请注意,我还将配置中的端口更改为 3006

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:3006/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

我正在等待顺利运行,但是:

IIS 给我一个来自 Chrome 的空白页

以及来自资源管理器的 HTTP 400 错误请求

最后,如果我从配置文件中删除地址部分,一切正常。但其他令人困惑的事情是,在上述场景(提供地址)之后,在我的另一台计算机上,我可以访问该服务。所以,我真的厌倦了寻找为什么这在一台计算机上工作而不在另一台计算机上工作。谁能给我解释一下?

我知道它有点长,但我必须解释清楚。 谢谢

【问题讨论】:

我遇到了同样的问题,我解决了。那是很久以前的事了,但如果到那时还没有人回答你,我可以找到文档:) @Alireza 谢谢。我会很感激你,如果你现在为我提供。因为我在任何地方都找不到答案,而且你很可能很快就会忘记这个问题:) 不,我不会。不要让我保持清醒去寻找解决方案 ;-) 这里是凌晨 2 点,我困了 @Alireza 好的。现在睡觉:) 如果没有人回答,我等着你的消息 梅尔哈巴!我认为这不仅仅是一项服务。您能否添加一个简单的 ASPX 页面并将其发布到这个新网站,然后看看您是否可以浏览该页面? 【参考方案1】:

根据我的搜索,我不应该提供地址。

msdn.microsoft.com/en-us/library/aa751792(v=vs.110).aspx

对于 IIS 托管服务,您必须始终使用相对端点地址 端点。提供完全限定的端点地址(例如, localhost/MyService.svc) 可能会导致部署错误 如果端点地址不指向 IIS 应用程序,则提供服务 托管暴露端点的服务。使用相对端点 托管服务的地址避免了这些潜在的冲突。

【讨论】:

【参考方案2】:

我认为这会解决你的问题:

将此端点添加到您的服务:

<endpoint address="mex" binding="mexHttpBinding" 
    bindingConfiguration="" contract="IMetadataExchange" />

并将servicename 属性更改为您的服务类的全名:

<service behaviorConfiguration="EmployeeServiceBehaviour" 
    name="Namespace.EmployeeConfigurationClass">

希望够了

【讨论】:

谢谢,我会试试的。我有两台电脑,一台在工作,一台在家里。请注意,如果我删除地址部分,我可以同时浏览它们。如果我提供地址,我只能在工作计算机上浏览,家用计算机会在我的问题中给出上述答复。所以,我怀疑类似 IIS 设置。 今晚我们会修复它:) 希望如此,谢谢。我在 IIs 上搜索 HTTP 400 错误 是的,我只是在找它。它没有用。但根据我的搜索,我不应该提供地址。 msdn.microsoft.com/en-us/library/aa751792(v=vs.110).aspx 说:对于 IIS 托管的服务端点,您必须始终使用相对端点地址。如果端点地址不指向承载暴露端点的服务的 IIS 应用程序,则提供完全限定的端点地址(例如,localhost/MyService.svc)可能会导致服务部署错误。使用托管服务的相对端点地址可以避免这些潜在的冲突。 我不知道为什么这适用于我的一台计算机而不适用于其他计算机,但我认为最好不要提供地址,这样两台计算机都可以使用。感谢您帮助 Alireza【参考方案3】:

这可能会有所帮助。我刚刚花了两个多小时试图让这个工作。我使用 FF 及其设置为默认浏览器。

在 FF 中,它在我的 URL 末尾添加了 /

http://services.tester.dev/VehicleFeedService.svc/

返回一个NetworkError: 400 Bad Request

但是在 IE 或 chrome 中,它不会将 / 放在末尾,并且可以正常工作。

需要注意的一件事.. 即使在给我 400 错误请求的 FF 中,?wdsl 确实有效

http://services.tester.dev/VehicleFeedService.svc?wsdl

似乎 / 导致了问题

【讨论】:

【参考方案4】:

您可以尝试 fiddler,也可以尝试 svcTracer,它可能会在其顶部为您提供大量调试信息,您也可以在服务器上使用 includeExceptionDetailInFaults=true 标志,但重要的是要指出发送此信息并不总是正确的如果客户是外部实体,特别是客户。以下是如何使用它的提示。

<serviceBehaviors>
    <behavior name="ServiceBehavior">
    ....
        <serviceDebug includeExceptionDetailInFaults="true" />
    ....
    </behavior>
</serviceBehaviors>

调试愉快:)

【讨论】:

以上是关于IIS 托管的 WCF 服务返回 HTTP 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

WCF:自托管服务上的 HTTP 400 错误请求

wcf 服务错误请求 400 流式传输

WCF服务的IIS托管(应用程序)

如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题

在 IIS 中托管时如何从代码配置 WCF 服务?

启用从 jQuery ajax 到不在 IIS 中托管的 WCF 服务的 CORS POST