为了将旧URL重定向到新URL,我在Windows 7的IIS 7.5中的默认网站内设置了一个DbProvider(在生产中它将在Windows Server 2012 R2中的IIS 8下)。这是我在默认网站的web.config中的配置(以便其中的每个应用程序都可以继承它:
<rewrite>
<providers>
<provider name="LORYDB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f">
<settings>
<add key="ConnectionString" value="Driver={SQL Server Native Client 10.0};Data Source=localhost\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True;Server=localhost;uid=sa;pwd=xxxxxx" />
<add key="StoredProcedure" value="GetRewrittenUrl" />
<add key="CacheMinutesInterval" value="0" />
</settings>
</provider>
<provider name="LORYMAP" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f" />
<provider name="LORYCONTAINER" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f" />
</providers>
<rules>
<rule name="DbProviderTest" stopProcessing="true">
<match url="(OmniService/foto/([0-9]+)-([0-9]+).jpg)" />
<conditions>
<add input="{LORYDB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
</rules>
</rewrite>
<tracing>
<traceFailedRequests>
<add path="*">
<traceAreas>
<add provider="ASP" verbosity="Verbose" />
<add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
<add provider="ISAPI Extension" verbosity="Verbose" />
<add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" />
</traceAreas>
<failureDefinitions statusCodes="500" />
</add>
</traceFailedRequests>
</tracing>
我很确定所有参数都是正确的,总体来说是字符串连接和存储过程,因为我试图通过一个简单的python脚本调用它们并且它们工作正常。此外,RegEX espression也是正确的,因为IIS正确检测并拆分URL(在测试阶段,这种格式为http://localhost/OmniService/foto/18443151-810079.jpg
)。但是,在浏览器中我收到HTTP 500错误。所以,我在IIS中启用了模块失败请求跟踪,我得到一个非常复杂的.xml文件,我可以从中看到错误是500.50,这直接涉及重写/重定向模块,但我不确切地知道问题出在哪里是。如果您想查看xml文件,可以阅读它here。阅读一些文档,我发现当IIS_IUSRS
组对C:\Windows\Temp
没有完全控制权时会引发错误。我给了它许可,但没有任何改变。
我真的需要确切地了解问题所在。
例如,这个简单的python sripts可以工作:
import pypyodbc
if __name__=='__main__':
connection=pypyodbc.connect("Driver={SQL Server Native Client 10.0};Data Source=localhost\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True;Server=localhost;uid=sa;pwd=working2014")
cursor=connection.cursor()
cursor.execute("exec RewriteDB.dbo.GetRewrittenUrl @input='OmniService/foto/18443151-810079.jpg'")
print cursor.fetchone()
我得到了OmniService / foto / 2017/02/02 / 18443151-810079.jpg&#39;
这是正确的新网址。
谢谢大家。
更新
我不知道原因,但是.NET Framework不允许连接字符串Driver={SQL Server Native Client 10.0};
的这一部分,因为引发了此异常:
System.ArgumentException:Parola chiave&#39; driver&#39;非支持者。在系统中System.Data.Common.DbConnectionOptions..ctor(String connectionString,Hashtable synonyms,Boolean useOdbcRules)中的System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable,String connectionString,Boolean buildChain,Hashtable synonyms,Boolean firstKey)中。 System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString,DbConnectionPoolGroupOptions poolOptions,DbConnectionOptions&amp; userConnectionOptions)中System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString,DbConnectionOptions previous)中的Data.SqlClient.SqlConnectionString..ctor(String connectionString)在System.Data.SqlClient.SqlConnection.ConnectionString_Set(字符串值)中的System.Data.SqlClient.SqlConnection.set_ConnectionString(字符串值)在System.Data.SqlClient.SqlConnection..ctor(String connectionString)中的DbProvider.Rewrite(字符串值) )在Microsoft.Web.Iis.Rewrite.RewriteProviderManager.InvokeProviderUnicode(String pr) oviderName,String providerInput)
我想用另一个框架(Instant Developer)测试它,它将您编写的代码转换为基于.NET Framwork的Web应用程序。 我不知道为什么,不幸的是我没有.NET Framework的经验...无论如何,它可能是一个起点