我试图调和我在野外发现的一些意见。一个消息来源说,如果HTTP标头格式错误,在C#Request.UrlReferrer中将抛出System.UriFormatException。另一个说在这种情况下,Request.UrlReferrer实际上不会抛出异常,它只返回null。
那就是说,我正在开发一个能够捕获推荐网址以供将来参考的网络应用程序。我检查它是否为空,以便"不设置为对象的实例"转换为字符串等时错误不会爆发,并且测试结果正常。我也想知道是否应该为潜在的System.UriFormatExceptions包含错误处理。
有没有人碰到这个?谢谢!
编辑:鉴于NightOwl888的答案如下,确实会出现例外情况。多久一次,我不确定,但我宁愿防范它,也不愿冒公共网站上的例外风险。
我只是抓取referralUrl进行日志记录,因此它不会在任何下游应用程序上下文中使用。它只是让格兰威治生,我猜测以下代码应该涵盖我:
Uri referrer = null;
try
{
referrer = Request.UrlReferrer;
}
catch (UriFormatException)
{
referrer = null;
}
catch (Exception)
{
referrer = null;
}
var referralUrl = (referrer != null) ? referrer.ToString() : "None Found";
编辑:更改了例外并添加了常规捕获
答案 0 :(得分:0)
检查System.Web.HttpContext.Current.Request.UrlReferrer
的来源会显示以下内容。
public Uri UrlReferrer
{
get
{
if ((this._referrer == null) && (this._wr != null))
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(0x24);
if (!string.IsNullOrEmpty(knownRequestHeader))
{
try
{
if (knownRequestHeader.IndexOf("://", StringComparison.Ordinal) >= 0)
{
this._referrer = new Uri(knownRequestHeader);
}
else
{
this._referrer = new Uri(this.Url, knownRequestHeader);
}
}
catch (HttpException)
{
this._referrer = null;
}
}
}
return this._referrer;
}
}
因此,如果网址格式错误,可能会发生UriFormatException
,因为HttpException
是唯一设置为null
和UriFormatException
does not inherit from HttpException
的类型。
更好的选择可能是使用Request.Headers["Referer"]
,它会将原始字符串作为pointed out here返回。但请注意标题可以包含任何值(包括不是URL的值)。
IMO,Referer
标题只应用于日志记录,因为它不够可靠,无法用于实现任何类型的应用程序功能(除非在缺少某种情况下存在某种备份功能或畸形)。在某些情况下,浏览器可以(并且经常)忽略发送它。