尝试将旧版Web应用程序从IIS8移动到Azure Web应用程序。该应用程序包含许多对没有端点配置构建的WCF服务的ajax调用,类似于此处描述的方法:http://stevemichelotti.com/restful-wcf-services-with-no-svc-file-and-no-config/
正如文章中所建议的,System.Web.Routing用于将请求路由到正确的服务。例如,我的global.asax包含如下路由:
RouteTable.Routes.Add(new ServiceRoute("svc/cmp/", new WebServiceHostFactory(), typeof(CompanyService)));
RouteTable.Routes.Add(new ServiceRoute("svc/cont/", new WebServiceHostFactory(), typeof(ContactsService)));
因此,http://example.com/svc/cmp/GetCompany?id=1234的请求将被路由到CompanyService进行处理。
在IIS上运行时,这些调用都可以正常工作,但在Azure Web应用程序上返回404未找到的错误。
我尝试向web.config添加处理程序,如下所示:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
还尝试在Azure应用设置中添加处理程序映射,以使%windir%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_isapi.dll处理所有扩展名(*)。
在任何一种情况下都没有运气。
答案 0 :(得分:0)
通过删除Azure Web应用并重新创建它来解决此问题。它最初是使用WordPress模板创建的,其中虚拟目录/应用程序托管了站点的.net部分。
显然,并非所有路由模块都加载了WordPress模板,因此WCF服务未正确路由。在使用Web应用程序模板重新创建之后,所有服务都运行良好。
<强>更新强>
重新安装WordPress后,此问题重新出现。现在我对正在发生的事情有了更好的理解,我认为如果有人遇到类似问题我应该更新。
WordPress安装在网站root中,WCF服务位于子应用程序中。事实证明,WordPress在root的web.config中创建了一个重写规则,这破坏了我的WCF服务。重写规则如下所示:
<rewrite>
<rules>
<rule name="Wordpress: https://example.com" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
此规则与启用非常永久链接有关,并说如果URL与文件系统上的文件或文件夹不对应,它会将URL重写为index.php文件&#34;。
好吧,我的WCF服务的网址与文件或文件夹不对应,因此它们都被破坏了。通过清除子应用程序中的web.config中的重写规则解决了这种情况:
<rewrite>
<rules>
<clear />
</rules>
</rewrite>
经验教训。