Wordpress永久链接在IIS 7上使用服务工厂的WCF服务

时间:2014-03-06 18:29:37

标签: wordpress wcf iis permalinks

假设您在IIS 7上托管Wordpress并且想要激活永久链接。查看codex here,您将看到要添加到<system.webServer>标记中的web.config文件(位于WordPress安装的根目录)的示例代码:

<rewrite>
    <rules>
        <rule name="Main Rule" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll">
                <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>

一切都很顺利,网址重写规则的条件正确地忽略了系统中存在的现有文件和文件夹。

但是,你可能会像我一样,在某个子文件夹中忽略每个uri,即使文件系统上没有相应的文件。在我的情况下,我在一个子目录/Services/中使用web.config的<serviceActivations>区域(在子目录中)以下列形式托管一组WCF服务:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
   <serviceActivations>
     <add factory="System.ServiceModel.Activation.ServiceHostFactory" relativeAddress="./AccountService.svc" service="MyAssembly.Services.AccountService"/>
  </serviceActivations>
</serviceHostingEnvironment>

导航到AccountService.svc会导致找不到404。

你怎么能处理这种情况?下面我发布了我的具体解决方案,但还有其他方法可以实现这一目标。此外,一般案例解决方案仍然难以捉摸,所以问题仍然存在,你如何处理这种情况呢?

1 个答案:

答案 0 :(得分:0)

以下我提供了我的解决方案作为URL Rewrite世界的完全新手。该解决方案特定于特定文件夹。

要解决我的问题,必须为重写规则添加一个附加条件:

<rewrite>
    <rules>
        <rule name="Main Rule" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                <add input="{REQUEST_URI}" pattern="^/Services/.*" negate="true" />
            </conditions>
            <action type="Rewrite" url="index.php" />
        </rule>
    </rules>
</rewrite>

在您的情况下,将我的文件夹名称替换为&#34;服务&#34;就够了。

如果要对任何目录或目录层次结构执行此操作,如果存在目录层次结构,则允许包含该目录层次结构的任何URL通过而不进行重写。到目前为止,我对此的尝试主要围绕匹配包含目录层次结构的url部分,并使用后引用来检测此目录是否存在:

        <rule name="ignoreSubDirectoryURIs" stopProcessing="true">
            <match url="(.*)/.*\..*" ignoreCase="false" />
            <conditions>
                <add input="{APPL_PHYSICAL_PATH}\{R:1}\" matchType="IsDirectory" />
            </conditions>
            <action type="None" />
        </rule>

首先添加此规则,以便在成功时不解释其他重写规则。

问题:虽然{APPL_PHYSICAL_PATH}是一个目录,但我无法正确解析{APPL_PHYSICAL_PATH}和子目录的任意组合。另一个问题是嵌套目录,其中{R:1}将返回dir1 / dir2,而不是dir1 \ dir2,这可能使这不适用于嵌套的情况。

如果不完整,阅读URL Rewrite Reference一直是有益的