【问题标题】:Azure web app hosted WCF services return 404Azure Web 应用托管的 WCF 服务返回 404
【发布时间】:2018-08-20 01:23:27
【问题描述】:

尝试将旧版 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 not found 错误。

我尝试将处理程序添加到 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 处理。

这两种情况都没有运气。

【问题讨论】:

    标签: wcf azure-web-app-service


    【解决方案1】:

    已通过删除 Azure Web 应用程序并重新创建它来解决此问题。它最初是使用带有虚拟目录/应用程序的 WordPress 模板创建的,该目录/应用程序托管网站的 .net 部分。

    显然,并非所有路由模块都使用 WordPress 模板加载,因此 WCF 服务未正确路由。使用 Web 应用程序模板重新创建后,所有服务都运行良好。

    更新

    重新安装 WordPress 后,此问题再次出现。现在我对发生的事情有了更好的了解,我想我应该更新一下,以防有人遇到类似问题。

    WordPress 安装在网站根目录中,而 WCF 服务位于子应用程序中。事实证明,WordPress 在根目录的 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 文件”。

    好吧,我的 WCF 服务的 URL 与文件或文件夹不对应,所以它们都被破坏了。通过在子应用程序的 web.config 中清除重写规则解决了这种情况:

    <rewrite>
      <rules>
        <clear />
      </rules>
    </rewrite>
    

    经验教训。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2019-11-18
      • 1970-01-01
      • 2019-08-15
      • 2015-07-01
      • 2021-07-06
      • 2011-05-17
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多