将我的 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 isHTTP
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
执行基于Get
的REST
请求。
更多信息 - 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
中配置了HTTPS
,HTTP
链接将不起作用,它会说404
错误.检查新服务器是否不断重定向到https
站点并且您没有在wcf 中启用https
,那么可能就是这个原因。使用Fiddler
或chrome 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 上发布我的网站时,注册/登录停止工作
是否有适用于 Windows 窗体的 Snoop (WPF) 或 FireBug (ASP.NET) 之类的东西? [关闭]
如何在 IIS 7、Windows 7 上将 ASP.NET 4.0 添加为应用程序池