404在IIS上运行.net 4 WCF服务时(无svc文件)

时间:2011-01-25 11:48:17

标签: wcf iis rest

我正在测试.net 4上的WCF中的REST服务 - 即没有svc文件。它在VS dev服务器上运行时效果很好,但当我将其切换为针对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有点愚蠢。

4 个答案:

答案 0 :(得分:28)

在挖掘其他论坛后解决了这个问题。

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

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

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

答案 1 :(得分:10)

我的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

  4. 这将在Handler Mappings中注册“svc-Integrated-4.0”。

答案 2 :(得分:1)

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

例如,Windows Communication Foundation HTTP Activation.NET Framework 3.5中的.NET Framework 4.6功能有HTTP ActivationMessage Queuing (MSMQ) Activation以及其他功能。

在Windows 10中,默认情况下不会安装这些功能,因此请注意查看Windows Features

答案 3 :(得分:0)

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

延伸: .svc

可执行文件:

C:\ Windows \ Microsoft.NET \框架\ v4.0.30319 \ ASPNET_ISAPI.DLL