WCF 服务在方法请求上返回 404

Posted

技术标签:

【中文标题】WCF 服务在方法请求上返回 404【英文标题】:WCF service returning 404 on method requests 【发布时间】:2013-04-20 20:25:15 【问题描述】:

我有一个仅通过 SSL 运行 WebGets/WebInvokes 的 WCF 服务页面 - 它在我的本地计算机上运行良好(自签名证书)。然而,在生产环境中,我可以访问 service.svc(它给了我关于如何使用的消息)但 service.svc/AnyRequest 返回 404。这两个环境都托管在 IIS 7.5 中。

我启用了跟踪,服务甚至没有接收任何方法请求(例如 service.svc/SomeRequest),但是它正在处理 service.svc 就好了。它也在https://computername.domain.net/path/service.svc 收听——这正常吗?它通常应该指向https://publicfacing.com/path/service.svc吗?

另请注意,生产服务器在 IIS 中托管多个站点。

下面是我的 web.config 的 system.serviceModel 部分。 SSLBehave 是由 here 建议的。

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="TransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SSLBehave">
          <useRequestHeadersForMetadataAddress>
            <defaultPorts>
              <add scheme="https" port="443"/>
            </defaultPorts>
          </useRequestHeadersForMetadataAddress>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="UserManagement.ajaxAspNetAjaxBehavior">
          <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
    <services>
      <service name="UserManagement.ajax" behaviorConfiguration="SSLBehave">
        <endpoint address="" behaviorConfiguration="UserManagement.ajaxAspNetAjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="TransportSecurity" contract="UserManagement.ajax" />
      </service>
    </services>
  </system.serviceModel>

【问题讨论】:

如果在本地调用该服务是否工作? @theusguy 否定,仍然返回 404。 如果你的问题依然存在,我的回答或许对你有帮助 【参考方案1】:

每当我使用新开发的 WCF Web 服务遇到 404 时,我要做的第一件事是检查解释此类调用所需的处理程序映射,因为这通常是问题的原因。有几种方法可以解决这个问题,其中许多需要手动执行ServiceModelReg.exe 控制台命令:这些无疑是有效的过程,但如果您的开发机器具有特别复杂的配置,也可能不起作用 - 或产生额外的问题.我在下面提出的解决方法虽然拉开时间稍长,但优点是解决问题更安全可靠。

打开服务器管理器界面进行机器管理,通常出现在任务栏开始菜单中。 转到仪表板(或控制面板)并选择添加角色或功能以打开向导。 选择基于角色或基于功能的安装类型以及您要使用的服务器,即您的本地/本地服务器。 转到 Features 部分:在那里,展开 .NET Framework 3.5 Features 节点和/或 .NET Framework 4.5 Features节点,具体取决于您安装的内容:如果两者都有,则应执行以下步骤两次(每一个都执行一次)。 展开 WCF 服务部分(如果可用),然后选择 HTTP 激活(见下面的屏幕截图)。 继续直到完成向导,然后单击安装

安装完成后,您应该能够运行 WCF 服务而不会再次出现 404 错误。

有关此特定问题及其解决方法的更多信息,您也可以在我的博客上read this post。

【讨论】:

超级有帮助。我厌倦了探索一切只是为了发现 WCF http 激活被禁用。非常感谢! 在 Windows 10 上,我通过以下方式启用了此选项:控制面板 > 程序 > 打开或关闭 Windows 功能 > .NET Framework 4.7 高级服务 > WCF 服务 > HTTP 激活 想要分享我正在将一些 WCF 服务从旧服务器迁移到新的 Windows Server 2019 服务器,这解决了问题。在此之前,我在调用 WCF 时收到错误 HTTP Error 404.0【参考方案2】:

我会从检查一些事情开始;

托管目录的权限? .Net版本是否正确? 您是否已将证书添加到站点? 尝试将图像放在同一路径中,您能导航到该路径吗(排除偶尔出现的奇怪路径映射)

祝你好运!

【讨论】:

虽然这并没有解决我的问题,但对于任何寻求解决方案的人来说,其中大部分都是最好的选择。享受赏金。 :) ElatedOwl,如果你解决了问题,请发表你的答案。 对于任何发现此问题的人,我遇到了类似的问题,这是我的问题,并附有 解决方案:***.com/questions/26398049【参考方案3】:

您可以使用 WsHttp 绑定来实现传输级别的安全性。见this article;在你的绑定中尝试这个投标:

<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>

文章提到您应该将绑定与端点绑定。

【讨论】:

【参考方案4】:

我遇到了同样的问题。根据我的阅读,默认情况下,WCF 不是 NT Authenticated 授权(或 HTTPContext 兼容)。

我必须将此添加到我的 WCF 服务 web.config 的配置文件中:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

你做了什么,加上这个:

关于我必须添加的实际服务类定义:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataService : IDataDeliveryServiceContract

这解决了我的问题。

【讨论】:

嘿,我在 WCF.config 文件中添加了标签,并在服务中也添加了属性,正如你所说,但仍然出现错误和交叉浏览错误。【参考方案5】:

也许在你的 RouteConfig.cs 文件中添加这一行:

routes.IgnoreRoute("resource.svc/*pathInfo");

只要您的 .svc 文件位于应用程序的根目录中。

【讨论】:

当您尝试直接从 MVC 应用程序调用 WCF Service 时,此答案非常有用。我收到404 - Not Found error 用于 jquery 发布请求。现在解决了,这对我有帮助。 :)【参考方案6】:

正如您所提到的,您可以通过 .svc 扩展名service.svc 访问您的服务,但不能以 REST 格式 service.svc/AnyRequest,问题一定出在 routing integration 中。

将此添加到您的web.config

 <system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </modules>
  <handlers>
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd"/>
  </handlers>
 </system.webServer> 

在 IIS 6 中这个错误的原因一定是Check that file exists 设置了 svc 扩展,确保“检查文件是否存在”没有被选中。如需更多信息,请参阅IIS Hosted Service Fails。

【讨论】:

【参考方案7】:

为了帮助其他发现自己陷入困境的人 - 可能是您的服务名称不是 fully qualified name,它必须是。

【讨论】:

【参考方案8】:

web.config 中的以下设置修复了 HTTPS 网站上的 WCF .svc 404:

      <webHttpBinding>
             <!-- https -->
             <security mode="Transport">
                    <transport clientCredentialType = "None" proxyCredentialType="None"/>
            </security>
    </binding>
  </webHttpBinding>

【讨论】:

【参考方案9】:

我尝试了上述解决方案,安装 WCF 服务,确保 API 目录中有适当的权限以及其他几件事。

虽然其中一些是问题,但对我来说还有一个问题没有在上面提到。

如果为整个服务器或给定站点启用了请求过滤,请确保 .svc 是受信任的文件扩展名,否则将被阻止。转到 IIS > 请求过滤。单击编辑功能设置。检查是否选中了“允许未列出的文件扩展名”。如果是这样,请确保列表中有 .svc 条目。否则 IIS 将阻止文件被提供。

【讨论】:

以上是关于WCF 服务在方法请求上返回 404的主要内容,如果未能解决你的问题,请参考以下文章

从 jQuery AJAX 调用 WCF 服务方法返回 404

客户端中的 WCF 服务通过 https 返回 404

带有 WCF 调用的 Ajax 返回 404 错误

RESTful WCF 服务返回“找不到资源”。错误

wcf 由 http 更改为 https 返回404,没有终结点在侦听可以接受消息的

部署的 WCF Silverlight 应用程序返回 404 错误