30

我有一个 WCF 服务页面,仅通过 SSL 运行 WebGets/WebInvokes - 它在我的本地机器上运行良好(自签名证书)。但是,在生产环境中,我可以访问 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 是从这里建议的。

  <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>
4

9 回答 9

26

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

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

在此处输入图像描述

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

有关此特定问题以及如何解决它的更多信息,您还可以在我的博客上阅读这篇文章。

于 2017-10-20T23:33:14.030 回答
15

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

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

祝你好运!

于 2013-05-01T09:09:30.353 回答
7

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

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

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

于 2013-05-03T19:53:14.247 回答
6

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

我必须将此添加到我的配置文件中,以便在以下部分中为 WCF 服务 web.config 配置:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

你做了什么,加上这个:

在实际的服务类定义中,我必须添加:

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

这解决了我的问题。

于 2013-05-03T14:25:28.140 回答
5

也许在您的 RouteConfig.cs 文件中添加以下行:

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

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

于 2015-06-25T02:38:08.987 回答
4

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

将此添加到您的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 托管服务失败

于 2013-05-05T17:53:34.463 回答
2

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

于 2019-01-14T09:20:47.003 回答
1

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

      <webHttpBinding>
             <!-- https -->
             <security mode="Transport">
                    <transport clientCredentialType = "None" proxyCredentialType="None"/>
            </security>
    </binding>
  </webHttpBinding>
于 2019-08-16T09:10:52.253 回答
0

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

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

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

于 2021-01-29T21:34:00.720 回答