Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest仅在.NET 4.0上运行_C#_Vb.net_.net 4.0_.net 3.5_Httpwebrequest - Fatal编程技术网

C# HttpWebRequest仅在.NET 4.0上运行

C# HttpWebRequest仅在.NET 4.0上运行,c#,vb.net,.net-4.0,.net-3.5,httpwebrequest,C#,Vb.net,.net 4.0,.net 3.5,Httpwebrequest,我遇到了一个奇怪的问题,甚至是WebRequest的行为。首先也是最重要的是,我想做的是: Dim req作为HttpWebRequest=CType(Net.WebRequest.Create(“https://cloud.myweb.de/myenginge/dostuff),HttpWebRequest) Dim inputString As String=“text=DoStuff” Dim数据为Byte()=System.Text.Encoding.ASCII.GetBytes(inp

我遇到了一个奇怪的问题,甚至是WebRequest的行为。首先也是最重要的是,我想做的是:

Dim req作为HttpWebRequest=CType(Net.WebRequest.Create(“https://cloud.myweb.de/myenginge/dostuff),HttpWebRequest)
Dim inputString As String=“text=DoStuff”
Dim数据为Byte()=System.Text.Encoding.ASCII.GetBytes(inputString)
请求方法=“POST”
req.Accept=“应用程序/xml;q=0.9,*/*;q=0.8”
req.ContentType=“应用程序/x-www-form-urlencoded”
req.ContentLength=数据.Length
str2=req.GetRequestStream()
str2.Write(数据,0,数据.长度)
str2.Close()
Dim resp As HttpWebResponse=CType(req.GetResponse,HttpWebResponse)
str=resp.GetResponseStream()
buffer=新IO.StreamReader(str,System.Text.Encoding.ASCII)。ReadToEnd
但是在我的编译设置中设置.NET Frame 3.5会导致以下情况的超时:

str2=req.GetRequestStream()
在设置框架版本4.0时,一切正常,没有任何超时问题。有人知道为什么会这样吗?我也试过3.0,但也没用


(本例中我使用的是VB.NET,但也欢迎使用C#解决方案。)

我猜您还有其他未处理的请求。在适用的情况下,更新代码以使用
using
语句(在处理实现
IDisposable
的任何对象时,应始终使用此语句),例如

这将确保所有流在进入下一个流之前可靠地关闭

更新

这绝对不是切换.NET Framework的问题,我将您的代码沙盒到一个小型控制台应用程序中,并按如下方式重新编写了代码(显然是将您的URL切换到另一个):

每次我都得到了成功的回复。我在.NET4.0和3.5下运行了相同的代码。以下是每个请求的外观:

POSTsomeurl HTTP/1.1
接受:应用程序/xml;q=0.9,/;q=0.8
内容类型:应用程序/x-www-form-urlencoded
主机:someurl
内容长度:12
期望:100继续
连接:保持活动状态

text=DoStuff


我将使用比较exe文件的IL代码。

也许这一级别的检查会让您了解不同版本之间的差异。

使用类似的工具查看请求中的差异。从技术上讲,如果请求完全相同,那么远程服务器不应该知道它们之间的区别,从而能够以不同的方式响应。要么请求在某些次要方面有所不同,要么不同的框架以两种不同的方式处理相同的响应。感谢您的提示如果您将
req.Timeout
设置为高于您所经历的超时的值,那么它能工作吗+1但是对于fiddler,至少你可以看到它是否真的在发送请求,以及它是否有任何不同。无论如何,你应该使用fiddler作为调试web请求的一个很好的工具,但是,我认为它在这种情况下对你没有帮助。您在向服务器发送任何内容之前对请求调用“GetRequestStream”时说超时发生了。@James:请求仍应显示在fiddler中,但不会有响应。因此,您应该仍然能够比较这两个请求,并尝试修改它们,然后在Fiddler中重新运行,以查看问题的触发因素。我现在将尝试此方法,实际上,wrappen这样的方法通常是一个好主意。但正如我所说,使用4.0版是可行的,但没有一个低于4.0版的版本会发送请求:(使用这种包装思想并不能解决我的问题-我无法确定是否存在任何打开的请求。这只是上面所示的代码执行。此外,我使用lock()语句(甚至Vb.net中的SyncLock)包装了我的代码)但是这也没有帮助。@inva您可能想重新阅读上一条语句,lol用我更新答案的代码重新编写,看看这是否解决了问题。您的初始代码使流保持打开状态(即使是在出现异常的情况下)这可能会导致线程池的连接不足。这个问题是否可能来自服务器?你可以控制服务器端的事情吗?@alex-我们都发现了lol,我想他至少可以说他尝试了一切!@James mymy我差点从椅子上摔下来
using (var stream = req.GetRequestStream())
{
    ...
}
Dim request = CType(WebRequest.Create("https://cloud.myweb.de/myenginge/dostuff"), HttpWebRequest)
Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes("text=DoStuff")
request.Method = WebRequestMethods.Http.Post
request.Accept = "application/xml;q=0.9,*/*;q=0.8"
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = data.Length
Using inputStream = request.GetRequestStream()
    inputStream.Write(data, 0, data.Length)
End Using

Dim response = CType(request.GetResponse(), HttpWebResponse)
Dim buffer As String = ""
Using outputStream = response.GetResponseStream()
    Using streamReader = New StreamReader(outputStream, System.Text.Encoding.ASCII)
        buffer = streamReader.ReadToEnd()
    End Using
End Using
Console.WriteLine(buffer)