在一个 asp.net core 3.0 项目中使用 IIS 的 url 重写规则,下面2种写法都会引发 null 引用异常,请问如何解决?
写法1:
var rewriteOptions = new RewriteOptions();
using (var sr = new StreamReader("Config/rewriteRules.config"))
{
rewriteOptions.AddIISUrlRewrite(sr);
}
写法2:
var rewriteOptions = new RewriteOptions();
rewriteOptions.AddIISUrlRewrite(env.ContentRootFileProvider,
"Config/rewriteRules.config");
null 引用异常:
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.AspNetCore.Rewrite.IISUrlRewriteOptionsExtensions.AddIISUrlRewrite(RewriteOptions options, TextReader reader, Boolean alwaysUseManagedServerVariables)
查看 Microsoft.AspNetCore.Rewrite 源码中的 UrlRewriteFileParser 实现,发现出现这个问题是由于 rewriteRules.config 中少了 <rewrite>
根元素,加上后就好了。
public IList<IISUrlRewriteRule> Parse(TextReader reader, bool alwaysUseManagedServerVariables)
{
var xmlDoc = XDocument.Load(reader, LoadOptions.SetLineInfo);
var xmlRoot = xmlDoc.Descendants(RewriteTags.Rewrite).FirstOrDefault();
if (xmlRoot == null)
{
return null;
}
//...
}
但上面的实现代码中直接返回 null 不是一个好的做法。