2017-03-28 218 views
1

我们目前有一个旧的传统WCF服务,我真的不想维护,但仍有几个客户端可以访问。我们目前在Azure的WEB API 2中运行所有的API服务。要启用向后兼容性我希望使用路由属性,像这样来模拟网络API的WCF路由:在WEB API中模拟WCF路由2

[RoutePrefix("registration.svc")] 
public class RegistrationDeprecatedController : ApiController 
{ 

    [HttpPost] 
    [Route("login")] 
    public async Task<HttpResponseMessage> Login(CredentialModel creds) 
    {... 

本地运行,这就像一个梦。只要我发布到Azure AppService,但是我得到的所有内容都是404未找到。具体路线问题:

/registration.svc/login 

我怀疑是IIS主机有.svc路由文件关联处理请求作为WCF调用。在线广泛的搜索未能找到任何有关如何改变这种关联的信息,甚至无法确认是否属实。任何想法如何解决或替代解决方案将不胜感激。

更新

找到了解决办法,但它并不完美。发现可以直接连接到AppService实例上的IIS并更改处理程序映射。这并不完美,因为创建新实例或部署插槽时需要手动更改,我宁愿将整个过程自动化。

如果其他人想这样做,你可以按照benjamin perkins的教程。我确实需要在Windows 10上安装一个IIS Manager for remote administration扩展,但为了这个工作。我删除了与* .svc关联的所有映射,并且路由正在工作。

+1

为该特定路径添加处理程序,以便在iis可以处理它之前拦截它 – Nkosi

回答

1

最终的解决方案是删除web.config中的处理程序。

<system.webServer> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <remove name="svc-Integrated" /> 
     <remove name="svc-Integrated-4.0" /> 
     <remove name="svc-ISAPI-2.0" /> 
     <remove name="svc-ISAPI-2.0-64" /> 
     <remove name="svc-ISAPI-4.0_32bit" /> 
     <remove name="svc-ISAPI-4.0_64bit" /> 
     .... 
    </handlers> 

我能够通过连接到AppService实例上的IIS找到名称。我不确定哪些需要删除,所以我删除了所有与* .svc关联的处理程序。

+0

我刚刚在寻找这个解决方案,需要使用WebAPI模拟WCF。您在web.config中移除svc处理程序的解决方案非常完美 - 谢谢! – James