2014-01-29 111 views
2

我最近将Visual Studio升级到2013,现在默认情况下只使用IIS Express(而不是Cassini),并且发现我不能再打我的WCF服务了javascript端点:Myservice.svc/js或/ jsdebug,但直接点击.svc会正常工作。WCF + MVC + WebAPI处理程序和路由

我发现,如果我删除我的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> 

有些情况下,我使用.NET 4.5,MVC 5.1的WebAPI V2.1和WCF都在同一个项目中。基本上是所有组件的最新版本。

更新1: 我也注意到,所有的WebAPI PUT的都回来了,与这些处理器去掉404;所以有些东西显然缺失。另一个小小的顿悟是,当部署到活动服务器(IIS 7.5 [7.5.7600.16385版))时,一切都很好。因此,Visual Studio 2013集成版本的IIS Express和完整的IIS 7.5安装程序的路由或处理程序映射必须有所不同。

此外,如果我创建一个全新的ASP.NET Web应用程序并添加一个WCF服务,一切工作正常本地。如果我然后添加一个WebAPI控制器,下面的处理程序部分被添加到web.config并打破所有的WCF调用。当MVC,WCF和WebAPI都是一个应用程序的一部分时,这听起来更像是微软默认配置中的一个'bug'。

更新2: 这里有一个基本的测试用例,任何人都可以重现我遇到的错误。

过程重新基地问题: (的WebAPI工作,WCF * .SVC/JS导致404)

  1. 新建项目 - > Asp.NET Web应用程序,使用Web API模板(包括MVC和Web API参考)
  2. 添加新的“WCF服务(支持Ajax)项目名为root “TestService的”
  3. 启动项目。
  4. 验证/帮助路工程MVC(呈现帮助页)
  5. 验证GET/API /值的WebAPI(返回值)/ 1作品
  6. *验证PUT/API /价值/ 1作品的WebAPI(没有返回 - 空法)*
  7. 验证TestService的。 svc可以击中WCF(显示元数据页面)
  8. *验证TestService.svc/js FAILS与404为WCF - 路由问题!*

部分修复: (PUT的WebAPI打破,WCF可以使JS请求)

  1. 从上面继续...
  2. 更新Web.config文件,并注释掉<处理>部分
  3. 启动项目。
  4. 验证/帮助路工程MVC(呈现帮助页)
  5. 验证GET/API /价值/ 1作品的WebAPI(返回值)
  6. *验证PUT/API /价值/ 1失败与404A WebApi - 路由问题! *
  7. 验证TestService.svc可以命中WCF(元数据显示页)
  8. *验证TestService.svc/JS渲染所需的JavaScript的WCF *
+0

IIS Express并没有真正执行IIS行为的正确再现,也没有为替代方案提供许多好处。使用ASP.NET开发服务器会发生什么? – CodeCaster

+0

我没有单独安装IIS Express,只是Visual Studio默认安装/运行的一个。 – bmherold

+0

我明白,但你可以改变你的项目属性。 – CodeCaster

回答

3

这实际上是一个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 } 
     ); 
    } 
} 
+0

嗯,在我的RouteConfig开始时,我确实有这条线,并且在处理程序到位时,我的* .svc/js仍然是404。另外,随着处理程序的移除,我也注意到任何WebAPI PUT都会以404的形式返回;所以我想你是错的。 – bmherold

+1

你可以发布一个使用web api的例子吗?你使用属性路由吗?我试图重新表达你的情况。基于你的问题的第一个编辑,我添加了一个简单的get方法的web api控制器,一切仍然适用于我。 –

+0

感谢Kenneth - 我在上面用我在一个空白项目上使用的确切步骤重新创建了我的问题添加了“Update 2”。我使用Windows 8.1和Visual Studio 2013以及内置的IIS Express,并且仅显示了步骤。 – bmherold