将我的 ASP.NET 网站移至 Windows Server 2012 上的 IIS 8 ...服务丢失:.svc 文件是可见的,但他们的方法给出了 404

Posted

技术标签:

【中文标题】将我的 ASP.NET 网站移至 Windows Server 2012 上的 IIS 8 ...服务丢失:.svc 文件是可见的,但他们的方法给出了 404【英文标题】:Moved my ASP.NET website to IIS 8 on windows server 2012... services missing: .svc files are viewable, but their methods give a 404 【发布时间】:2014-12-11 10:40:58 【问题描述】:

我从 Windows Server 2003 上的 IIS 6 移出。

可以浏览到 .svc 文件。如果我在浏览器中转到http://example.com/Service.svc,我会得到一个很好的标准“这是 Windows© Communication Foundation 服务”页面。

但是无法浏览到任何方法 - 如果我在浏览器中转到http://example.com/Service.svc/Method?parameter=xyz,则会收到 404 错误。

有人见过这样的事情吗?有什么想法或建议吗?

我想我可能会遇到与这个问题类似的问题:WCF on IIS8; *.svc handler mapping doesn't work

但症状不同(看起来他们根本看不到 .svc 文件)并且没有任何解决方案有效(我安装了 WCF 功能的 Http Activation 等)。

【问题讨论】:

Is Method is HTTP Get or Post? 很确定所有方法都是 GET,但是不同的开发人员有几个不同的端点(没有一个有效)。 这是一个 RESTful WCF 服务还是一个普通的 SOAP WCF 服务?如果是 SOAP,请尝试 http://example.com/Service.svc。你需要一个代理来调用这些方法。 WCF 中是否设置了任何身份验证,或者在发出GET 请求之前必须设置特定的标头?或者您是否尝试直接从浏览器执行GET 请求? browse to any of methods 是什么意思 - 是不是只是为了获取所有方法和签名的列表?检查此链接 - ***.com/questions/18989423/… 【参考方案1】:

好的,我放弃了,向 Microsoft 支付了 250 美元的支持。在技​​术人员的帮助下,我们找到了解决方案,昨晚确认这绝对是我们所有服务器的解决方案:我们在 web.config 中为 WCF 服务完全禁用了 SSL:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding>
                <security mode="Transport" />

“传输”是指传输层安全性(TLS 是新的 SSL),因此是 HTTPS。将其更改为:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding>
                <security mode="None" />

事实证明,WCF 对您使用的是 HTTP 还是 HTTPS 非常敏感,如果您使用了错误的,您不会收到任何有用的错误,只会出现 404。

就我而言,新旧服务器都配置为始终使用 HTTPS 以确保安全。但在新服务器上,SSL (TLS) 加密在负载平衡器上终止。在这种情况下,加密只发生在用户的浏览器和我们的负载均衡器之间,我们的负载均衡器和 Web 服务器之间的流量是未加密的 HTTP

所以服务正在监听 HTTPS,当请求来自 HTTP 时,它完全忽略了它。

(所有其他在线讨论的类似问题都集中在卸载和重新安装 IIS 和 ASP.NET 以及 WCF 和 HTTP 激活等,所以我希望这对某人有所帮助。如果您对 MS 堆栈有疑问,我建议您使用 MS Support SO 无法及时回答。这肯定比浪费几个小时尝试单独修复要便宜得多)。

【讨论】:

最终证明是问题所在,我在对我的回答发表评论时告诉你。仅供参考,以防您错过我对我的回答帖子的评论。 是的(尽管在您发表评论时我们已经解决了这个问题)。感谢您花时间调查和重现错误。出色的工作,享受赏金! 将我的“Transport”更改为“TransportCredentialOnly”允许我使用 HTTP 测试我的服务。 我们在 F5 后面有一个 wcf 服务,它在幕后将 https 传输到 http。这修复了它【参考方案2】:

请检查您的 IIS 是否添加了 svc 处理程序。

WCF 服务不会在默认配置的 IIS 8 上运行,因为 Web 服务器不知道如何处理以 .svc 文件为目标的传入请求。你可以分两步教它:

    添加新的 MIME 类型:

Extension: .svc MIME type: application/octet-stream

    添加新的托管 HTTP 处理程序:

    Request path: *.svc Type: System.ServiceModel.Activation.HttpHandler Name: svc-Integrated

刷新您的网站/网络应用程序

参考文献:

http://gyorgybalassy.wordpress.com/2012/09/24/publishing-a-wcf-service-on-iis8/

http://proq.blogspot.hk/2012/09/wcf-on-iis-and-windows-8.html

http://forums.iis.net/t/1200413.aspx?+svc+missing+can+t+find+Module+to+load+within+Handler+Mapping+IIS+8+0

【讨论】:

谢谢!但不幸的是,我已经尝试过了。我找到了第一个链接,并按照说明进行操作 - 没有变化。 (我确实注意到 System.ServiceModel.Activation.HttpHandler 不在下拉列表中 - 那里还有其他命名空间,但不是那样,我必须输入它。如果这告诉我们任何想法的话?) 它不应该在下拉列表中。您是否尝试手动添加? 请检查您使用的 .Net 4.0 或 4.5 以及 wcf 是否安装在服务器上。可能是它没有安装所以程序集不在 GAC 中。 是的,我手动添加了它(像屏幕截图一样将它输入到框中)。 .Net 4 和 WCF 肯定安装在服务器上,检查了无数次。 请检查这是否适合您***.com/questions/11116134/…【参考方案3】:

只是想提供一系列建议,以防您还没有尝试过其中的一个:

是否有可能缺少预期方法的 [OperationContract]? 您是否在 web.config 中配置了任何可能重定向方法调用的 url 重写,例如 HTTP/S 重定向或某些路由配置? 在 IIS 中启用失败的请求跟踪以查看您遇到的 404 错误的子类型? 404.13?别的东西?这可能不是因为未找到某些内容,而是请求中存在其他错误。

其他来源:

http://www.iis.net/learn/troubleshoot/using-failed-request-tracing/troubleshooting-failed-requests-using-tracing-in-iis WCF service returning 404 on method reqests https://social.msdn.microsoft.com/Forums/vstudio/en-US/7d69a209-489e-486c-81f4-a660c539ae49/wcfiis-7-returns-404-but-only-for-some-method-arguments?forum=wcf https://social.msdn.microsoft.com/Forums/vstudio/en-US/7d69a209-489e-486c-81f4-a660c539ae49/wcfiis-7-returns-404-but-only-for-some-method-arguments?forum=wcf

【讨论】:

【参考方案4】:

您可以在wcf服务中启用跟踪/日志记录,这样您就可以直接从错误日志中检查实际的错误原因,如果参数或任何其他内容不匹配。

参考这个来启用跟踪,这只是简单的配置设置 - http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx 或 How to turn on WCF tracing?

...

其他建议:

ServiceContract 中,对于必需的方法,您使用了必需的属性。所以可以说,Service.svc 在IService.cs 中定义了servicecontractor,而您关心Method。那么Method 应该这样声明。

[OperationContract]
[WebGet(UriTemplate = "Method?parameter=value")]
string AnyMethodName(string value);

这里我使用string 作为输入和输出参数类型,你可以在这里使用所需的类型。 除此之外,您还需要 web.config 才能正确配置服务、绑定、端点等。参考-http://msdn.microsoft.com/en-us/library/ms733932(v=vs.110).aspx

因此,如果您将其托管在http://www.example.com 中,那么您可以使用http://www.example.com/Service.svc/Method?parameter=XYZ 执行基于GetREST 请求。

更多信息 - http://www.c-sharpcorner.com/UploadFile/b1df45/rest-based-api-using-wcf-services/

此外,如上所述,您可能已经检查并修复了一些 URL rewriting 设置。或直接尝试使用https 版本的 URL。或者如果有一些代理服务器被阻塞,必须检查。

如果有request filtering设置,则检查GET请求是否在那里被阻止。

或者如果可能的话,使用aspnet_regiis.exe -iru重新注册IIS。

【讨论】:

是的,正如我所说,服务可以在旧的生产服务器中找到,所以 ServiceContract、端点、绑定等都很好。追踪是个好主意,尝试一下…… @MGOwen ,重现了您的问题,当我浏览 HTTPS 版本的站点 .svc 时,我已经使用 IIS 8.5 将示例 WCF 应用程序部署到 2012 服务器,但是当我使用 .svc/Method?parameter=xyz 时它没有用(404 error - 和你的一样),后来尝试使用 http 工作的相同 URL,发现我没有使用 https 配置 WCF 应用程序,这就是 https 版本的原因,它向我显示了404 错误,这可能是问题的根本原因。结论,即使你没有为 wcf 设置https,浏览.svc 会起作用,但不是GET 请求。 @MGOwen,反之亦然,为真,即如果在 wcf 服务的web.config 中配置了HTTPSHTTP 链接将不起作用,它会说404 错误.检查新服务器是否不断重定向到https 站点并且您没有在wcf 中启用https,那么可能就是这个原因。使用Fiddlerchrome network console 进行检查。 msdn.microsoft.com/en-us/library/hh556232(v=vs.110).aspx - 在 web.config 中设置 https【参考方案5】:

希望它对某人有所帮助,尽管回复这篇文章已经很晚了。 我遇到了同样的问题,花了好几个小时才找到解决方案。终于换了

幸运的是,我得到了更改 RouteConfig.Cs 文件的答案,如下来自

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

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

只要您将 .svc 文件放在应用程序的根目录中即可。

这是我自己在此链接上提出的问题 WCF Service throws Http404 on any request except .svc

【讨论】:

当然!我正在一个新的 Web 应用程序项目中进行一些 WCF 测试,该项目包含所有 Web 技术(Web API、Web 窗体和... MVC!)感谢您的提醒 +1

以上是关于将我的 ASP.NET 网站移至 Windows Server 2012 上的 IIS 8 ...服务丢失:.svc 文件是可见的,但他们的方法给出了 404的主要内容,如果未能解决你的问题,请参考以下文章

我可以将我的 asp.net 应用程序移动到云端吗?

当我在 asp.net 上发布我的网站时,注册/登录停止工作

是否有适用于 Windows 窗体的 Snoop (WPF) 或 FireBug (ASP.NET) 之类的东西? [关闭]

如何在 IIS 7、Windows 7 上将 ASP.NET 4.0 添加为应用程序池

无法从Windows服务中托管的Asp.net核心网站启动多个Serilog接收器

我正在将我的 asp.net web api 迁移到 asp.net core。 Cors 迁移