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
控制台命令:这些无疑是有效的过程,但如果您的开发机器具有特别复杂的配置,也可能不起作用 - 或产生额外的问题.我在下面提出的解决方法虽然拉开时间稍长,但优点是解决问题更安全可靠。
安装完成后,您应该能够运行 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