C# WCF&x2B;MVC&x2B;WebAPI处理程序和路由

C# WCF&x2B;MVC&x2B;WebAPI处理程序和路由,c#,asp.net-mvc,wcf,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Mvc,Wcf,Asp.net Web Api,Asp.net Web Api Routing,我最近将Visual Studio升级到2013,现在默认情况下它只使用IIS Express(而不是Cassini),并且发现我无法再访问我的WCF服务javascript端点:Myservice.svc/js或/jsdebug,但是直接访问.svc就可以了 我发现,如果删除web.config的部分(其中包括一些ExtensionlessUrlHandler项),脚本端点的功能就会恢复。我很好奇删除以下项目会产生什么影响,以及是否有替代解决方案 以下是我从Web.config中删除的块: &

我最近将Visual Studio升级到2013,现在默认情况下它只使用IIS Express(而不是Cassini),并且发现我无法再访问我的WCF服务javascript端点:Myservice.svc/js或/jsdebug,但是直接访问.svc就可以了

我发现,如果删除web.config的部分(其中包括一些ExtensionlessUrlHandler项),脚本端点的功能就会恢复。我很好奇删除以下项目会产生什么影响,以及是否有替代解决方案

以下是我从Web.config中删除的块:

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

在某种背景下,我在一个项目中使用.NET4.5、MVC5.1、WebAPIv2.1和WCF。基本上是所有组件的最新版本

更新1: 我还注意到,任何WebAPI PUT都以404的形式出现,并且删除了这些处理程序;所以很明显有些东西不见了。另一个小启示是,当部署到实时服务器(IIS 7.5[Version 7.5.7600.16385])时,一切都很好。因此,Visual Studio 2013集成版IIS Express和完整的IIS 7.5设置的路由或处理程序映射必须有所不同

另外,如果我创建了一个全新的ASP.NET web应用程序并添加了WCF服务,那么在本地一切都会正常工作。如果我随后添加一个WebAPI控制器,下面的handlers部分将添加到web.config并中断所有WCF调用。当MVC、WCF和WebAPI都是一个应用程序的一部分时,这听起来更像是微软默认配置中的一个“bug”

更新2: 这是一个基本的测试用例,任何人都可以遵循它来重现我的错误

重新创建基本问题的过程: (WebAPI工作,WCF*.svc/js结果为404)

  • 新项目->Asp.NET Web应用程序,使用Web API模板(包括MVC和Web API参考)
  • 将新的“WCF服务(支持ajax)添加到名为“TestService”的项目根目录中
  • 启动项目
  • 验证/help路由是否适用于MVC(呈现帮助页面)
  • 验证GET/api/values/1是否适用于WebApi(返回值)
  • *验证PUT/api/values/1是否适用于WebApi(不返回任何内容-void方法)*
  • 验证是否可以针对WCF点击TestService.svc(显示元数据页)
  • *验证TestService.svc/js是否因404 for WCF路由问题而失败!*
  • 部分修复: (WebAPI放断,WCF可以呈现JS请求)

  • 从上面继续
  • 更新Web.config并注释掉部分
  • 启动项目
  • 验证/help路由是否适用于MVC(呈现帮助页面)
  • 验证GET/api/values/1是否适用于WebApi(返回值)
  • *验证PUT/api/values/1是否因404 for WebApi-路由问题而失败!*
  • 验证是否可以针对WCF点击TestService.svc(显示元数据页)
  • *验证TestService.svc/js是否为WCF提供了必要的JavaScript*

  • 这实际上是一个mvc路由问题。请如下修改~/App_Start/RouteConfig.cs。您需要保留ExtensionlessUrlHandler,以便mvc路由在无扩展URL上正常运行

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            //This line is the addition.
            routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    IIS Express并没有真正执行IIS行为的正确复制,也没有提供比其他方法更多的好处。使用ASP.NET开发服务器会发生什么?我没有单独安装IIS Express,只是使用Visual Studio默认安装/运行的IIS Express。我理解,但您可以在项目的属性中更改它ies。这些是VS2013选项:哦,天哪,它们真的削弱了这一个。看,IIS Express有它的怪癖,但是如果你删除了处理程序,然后它就可以工作了,为什么不把它留在那里呢?嗯,我实际上在我的RouteConfig的开始就有这一行,处理程序就位后,我的*.svc/js仍然是404ing。而且,处理程序删除后,我的*.svc/js仍然是404inged,我也注意到任何WebAPI PUT都是404;所以我想你是对的,缺少了一些东西。你能举一个你使用web api的例子吗。你在使用属性路由吗?我正在尝试重新调整你的情况。根据对你问题的第一次编辑,我添加了一个带有简单get方法和eve的web api控制器rything对我仍然有效。感谢Kenneth-我在上面添加了“更新2”,以及我在一个空项目中使用的确切步骤,以重新创建我的问题”。我正在使用Windows8.1和VisualStudio2013以及内置的IIS Express,并且只执行所示的步骤。