我试图找出UrlHelper.RouteUrl
为什么会返回以/(F(
开头的无Cookie网址的原因。这似乎只适用于Bing请求(Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
)。
我已经禁用过3次无Cookie模式:
<authentication mode="None">
<forms cookieless="UseCookies" />
</authentication>
<anonymousIdentification enabled="true" cookieless="UseCookies" />
<sessionState cookieless="UseCookies" />
我还添加了以下断言:
if (url.StartsWith("/(F(", StringComparison.Ordinal))
throw new Exception(
FormsAuthentication.CookieMode + " " +
FormsAuthentication.CookiesSupported + " " +
HttpContext.Current.Request.Browser.Cookies);
这引发了bing bot的情况。但它声称CookieMode == UseCookies && CookiesSupported == true && Browser.Cookies == true
。这意味着配置设置,以及ASP.NET认为Bing bot 支持cookie。没有任何理由将此无cookie的字符串添加到URL。
我无法在Windows 7 .NET 4.7上本地重现它。生产服务器运行带有.NET 4.7的Server 2008 R2。
我努力禁用这个令人讨厌的功能。我怎么能摆脱这种疯狂呢?
更新:F
似乎意味着表单身份验证功能负责。但很明显它在web.config中被禁用了?!据我所知,我没有以任何方式使用它(可能是一个错误的假设)。
另外,我测试了&#34; app路径修改器&#34; MVC正在使用的值:
var x =
(string)typeof(HttpResponse)
.GetField("_appPathModifier", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.GetValue(HttpContext.Current.Response);
我将此值添加到断言中,确实存在令人讨厌的/(F(
字符串。我不知道.NET Framework是如何设置这个值的。
答案 0 :(得分:0)
因为在此之前,已经从网址路径中删除了SessionId的值(CookielessHelper.RemoveCookielessValuesFromPath)。
HttpContext的Init方法对此进行处理。
private void Init(HttpRequest request, HttpResponse response)
{
this._request = request;
this._response = response;
this._utcTimestamp = DateTime.UtcNow;
this._principalContainer = this;
if (this._wr is IIS7WorkerRequest)
{
this._isIntegratedPipeline = true;
}
if (!(this._wr is StateHttpWorkerRequest))
{
this.CookielessHelper.RemoveCookielessValuesFromPath();
}
// other codes ...
}
请参考Possible Bug With ASP.NET MVC 3 Routing?
我将在Application_BeginRequest事件中检查Response._appPathModifier值,
protected void Application_BeginRequest(object sender, EventArgs e)
{
//到這時,Url已被改成沒包含SessionId
//但它的值會放在 Response._appPathModifier 變數之中
var appPathModifierFieldInfo = Context.Response.GetType().GetField("_appPathModifier",
BindingFlags.NonPublic | BindingFlags.Instance);
var appPathModifier = appPathModifierFieldInfo.GetValue(Context.Response);
if (appPathModifier != null)
{
//url 中有 SessionId
throw new HttpException(404, "Not found");
}
}