【问题标题】:404 when running .net 4 WCF service on IIS (no svc file)在 IIS 上运行 .net 4 WCF 服务时出现 404(无 svc 文件)
【发布时间】:2011-01-25 11:48:17
【问题描述】:

我正在 .net 4 上的 WCF 中测试 REST 服务 - 即没有 svc 文件。在 VS 开发服务器上运行时效果很好,但是当我将其切换到 IIS 上运行时,我在尝试浏览帮助页面或点击任何服务方法时得到 404。

我已经退回到一个简单的服务,只是让它在 IIS 上运行,但我不确定它有什么问题。

global.asax 有

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(DataPortalService)));
    }

服务本身就是这么简单:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataPortalService : IDataPortalService
{
    [WebGet(UriTemplate = "Test/TestMethod")]
    public string TestMethod()
    {
        return "Hi!";
    }
}

[ServiceContract]
public interface IDataPortalService
{
    [OperationContract]
    string TestMethod();
}

和配置文件

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>  

</configuration>

点击 /help 页面或方法会给我一个 404.0.

我想我只是缺少 IIS 中的一些设置来启动它,尽管它在开发服务器上运行良好但在 IIS 上运行良好有点愚蠢。

【问题讨论】:

  • 您获得的是 HTTP 404.4 吗?如果是这样,请检查您的处理程序映射是否正确。
  • 不 - 它是 404.0。鉴于在这种情况下没有 svc 文件,哪些映射会接收请求?

标签: wcf iis rest


【解决方案1】:

在浏览了其他一些论坛后解决了这个问题。

我最初在我的网络配置中添加了以下内容:

<system.webServer>
    <handlers>
        <remove name="svc-Integrated-4.0" />
        <add name="svc-Integrated-4.0" path="*" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

显然,默认情况下 IIS 不知道如何处理无扩展名请求并将它们传递给静态文件处理程序。

鉴于 MVC 使用相同的例程架构,我认为基本 MVC 站点模板必须具有与上述类似的一些配置,因为我的 MVC 站点在移动到 IIS 时运行良好。

事实证明,它们的配置略有不同,而是具有以下条目:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

两种配置似乎都可以正常工作,但在这种情况下我决定使用第二个选项。

【讨论】:

  • 如果您尚未应用此修补程序 support.microsoft.com/kb/980368,则需要 runAllManagedModulesForAllRequests="true"。在此处阅读更多信息blogs.msdn.com/b/tmarq/archive/2010/04/01/…
  • 我从 Web Platform Installer 安装“IIS 7 推荐配置”解决了这个问题。
  • 我一直在努力让它发挥作用,最后你的回答做到了。
  • 太棒了。刚开始对此大胆,您的解决方案就像一个魅力。现在......如何一封垃圾邮件多于一张赞成票?
  • 感谢我尝试了许多其他解决方案,但这个真的对我有用
【解决方案2】:

我的 web.config 中有 runAllManagedModulesForAllRequests="true",但仍然无法通过 404.0。还尝试安装“IIS 7 推荐配置”,但没有任何运气。重新运行 aspnet_regiis 解决了我的问题。

  1. 在“运行”对话框中,键入 cmd,然后单击“确定”。

  2. 在命令提示符下,使用 cd 命令更改您要使用的 Aspnet_regiis.exe 版本的目录。默认情况下,Aspnet_regiis.exe 位于以下目录:systemroot\Microsoft.NET\Framework\versionNumber

  3. 然后运行以下命令:aspnet_regiis -ir

这将在处理程序映射中注册“svc-Integrated-4.0”。

【讨论】:

  • 这解决了我的问题。您还可以从 Visual Studio 命令提示符(在开始菜单中的 Visual Studio 工具下)运行 asp_regiis。
【解决方案3】:

如果您没有安装 .NET 框架的某些组件,也可以返回 HTTP 404 代码。

例如,.NET Framework 3.5 中有 Windows Communication Foundation HTTP Activation 功能,.NET Framework 4.6 中有 HTTP ActivationMessage Queuing (MSMQ) Activation 等等。

在 Windows 10 中,这些功能默认未安装,因此请记住查看Windows Features

【讨论】:

    【解决方案4】:

    在我机器上的 IIS 5.1 上,仅当我在网站级别和虚拟文件夹级别添加 HTTP 处理程序时才会提供 .svc 页面。理想情况下,这应该通过继承来工作!

    扩展名:.svc

    可执行文件:

    c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2014-08-25
      • 2014-08-23
      相关资源
      最近更新 更多