Azure Web应用程序托管的WCF服务返回404

时间:2018-03-12 04:31:46

标签: wcf azure-web-sites

尝试将旧版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处理所有扩展名(*)。

在任何一种情况下都没有运气。

1 个答案:

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

经验教训。