gpt4 book ai didi

.net - 为什么 .NET 2.0 升级到 .NET 4.0 后,HttpWorkerRequest 在 HttpRuntime.ProcessRequest 期间失败?

转载 作者:行者123 更新时间:2023-12-04 07:24:25 24 4
gpt4 key购买 nike

我正在将具有内部网络服务器的应用程序从 .NET 2.0 升级到 .NET 4.0。

我正在处理一个带有对象的请求 HttpListenerWorkerRequest , 扩展了 HttpWorkerRequest类,并创建一个请求 GetRawUrl()返回 http://localhost:82/Default.aspx 格式的 Url .

在 .NET 2.0 中,将此发送到 HttpRuntime.ProcessRequest(httpListenerWorkerRequest)可以正常工作,但是在 .NET 4.0 中,我得到一个网页,上面只有“错误请求”文本。

开裂HttpRuntime ,我可以看到错误请求是从 ProcessRequestInternal(HttpWorkerRequest wr) 抛出的,一个试图构建 HttpContext 的私有(private)方法。

我自己试过这个:

try
{
//what's going on?
hcontext = new HttpContext(workerRequest);
}
catch(Exception e)
{
//Debugging break point here
}

更新前(.NET 2.0),它构建良好,更新后(.NET 4.0),我得到一个 System.ArgumentException 说明
The relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here , 扔在
at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)
at System.Web.HttpRequest.get_ClientFilePath()
at System.Web.Security.CookielessHelperClass.RemoveCookielessValuesFromPath()
at System.Web.HttpContext.Init(HttpRequest request, HttpResponse response)
at System.Web.HttpContext..ctor(HttpWorkerRequest wr)
at Talcasoft.Web.Hosting.HttpWorkerThread.Run(Object request) in
C:\[OurLibrary].Web\Hosting\HttpWorkerThread.cs:line 51

.NET 发生了什么变化导致了这种情况,我能做些什么来解决它?

编辑 我刚刚注意到不允许的 http: 后面跟着一个斜杠,而不是双斜杠,尽管请求中的 GetRawUrl() 肯定返回 double 。

最佳答案

我不是 100% 确定这是“确切答案”,但看起来很接近我——还有更多要写的……

好像有一个breaking change VirtualPath 中的一种类 - 并通过他们如何检查 illegal characters 得到证实. (顺便说一句。你可以用谷歌搜索“VirtualPath 源”来寻找它的 .NET 4 版本)。

内部 VirtualPath.Create对“非法虚拟路径字符”调用检查。

它首先进入注册表(“ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET ”、“ VerificationCompatibility ”) - 查看 compatibility应该使用模式“非法字符”。

Based on that - I'm guessing (I don't have a way of checking this right now) - that if you set the above registry value (int) to 1 - you should get your methods working the old way and w/o any additional effort. Note: a IIS (or host process) restart may be required as suggested in one of the links



然后基于该注册表标志,它使用了这两个中的任何一个......
':', '?', '*', '\0' // .NET 4.0 - the default
'\0' // the 'compatibility' mode

这似乎实际上很好地描述了您的故事,因为您使用“端口”指定的路径实际上是 illegal根据新的默认值。

最后编辑/解释:

(根据评论和解决它的解决方案更新)
这是我对内部情况的理解:

1) .NET 4.0 之前的解决方案是 VerificationCompatibility键(见上文)。

2) 使用 .NET 4.0 内部处理和修复 url 路径变得更加健壮。在大多数情况下工作正常。简而言之, 在输入 之前,所有路径都已固定并标准化 VirtualPath.Create - 和你的 http://...成为预期的绝对路径 /Default.aspx .

但是,当您提供 HttpWorkerRequest (而不是请求/响应等) - raw Url直接取自 worker - 提供正确和规范化路径的责任取决于您的工作人员请求 . (这仍然有点不确定,看起来像是一个错误或内部处理不当)。

重现问题:
internal class MyRequest : SimpleWorkerRequest
{
public MyRequest() : base("", "", String.Empty, String.Empty, null) { }
public override String GetRawUrl() { return "http://localhost:82/Default.aspx"; }
}
// ...
var wr = new MyRequest();
var context1 = new HttpContext(wr);

给出错误 The relative virtual path 'http:/localhost:82/Default.aspx' is not allowed here.
修复:
public override String GetRawUrl() 
{ return new Uri(url, UriKind.RelativeOrAbsolute).AbsolutePath; }

以及一些基于该主题的研究 VerificationCompatibility注册表中的关键字似乎是它的关键。

Ampersand in URL filename = bad request

Configure IIS to accept URL with Special Characters...

For 32 vs 64 difference in Registry

这是来自微软的一个类似的东西——但似乎是“2.0”的“修补程序”,即不适用于你——而只是将它作为官方的东西附加在这一行中。

FIX: "HTTP 400 - Bad request" error message in the .NET Framework 1.1
FIX: Error message when you try to visit an ASP.NET 2.0-based Web page: "HttpException (0x80004005): '/HandlerTest/WebForm1.aspx/a:b' is not a valid virtual path"
ASP.NET 2.0 x64 – You may get HTTP 400 Bad Request or Error as mentioned in KB 932552 or 826437

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET

DWord Value Name: VerificationCompatibility  Value Data: 1

关于.net - 为什么 .NET 2.0 升级到 .NET 4.0 后,HttpWorkerRequest 在 HttpRuntime.ProcessRequest 期间失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16071861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com