5

WebRequest で奇妙な問題が発生したり、動作が発生したりしました。何よりもまず、私がやろうとしていることは次のとおりです。

Dim req As HttpWebRequest = CType(Net.WebRequest.Create("https://cloud.myweb.de/myenginge/dostuff"), HttpWebRequest)

Dim inputString As String = "text=DoStuff"
Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(inputString)

req.Method = "POST"
req.Accept = "application/xml;q=0.9,*/*;q=0.8"

req.ContentType = "application/x-www-form-urlencoded"
req.ContentLength = data.Length

str2 = req.GetRequestStream()

str2.Write(data, 0, data.Length)
str2.Close()

Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
str = resp.GetResponseStream()
buffer = New IO.StreamReader(str, System.Text.Encoding.ASCII).ReadToEnd

しかし、コンパイル設定で .NET Frame 3.5 を設定すると、次の場所でタイムアウトが発生します。

str2 = req.GetRequestStream()

フレームワーク バージョン 4.0 の設定が機能し、すべてがタイムアウトの問題なく通過します。なぜこれが起こるのか誰か知っていますか?3.0も試しましたがダメでした。

(この例では VB.NET を使用していますが、C# ソリューションも大歓迎です。)

4

2 に答える 2

2

私の推測では、まだ破棄されていない他のリクエストが開いていると思います。該当する場合はステートメントを使用するようにコードを更新しますusing( を実装するオブジェクトを扱うときは常にこれを使用する必要がありますIDisposable) 。

using (var stream = req.GetRequestStream())
{
    ...
}

これにより、次のストリームに進む前に、すべてのストリームが確実に閉じられます。

アップデート

これは、.NET Framework の切り替えに関する問題ではありません。コードを小さなコンソール アプリにサンドボックス化し、次のようにコードを書き直しました (明らかに、URL を別のものに切り替えています)。

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)

そして、私は毎回成功した応答を返しました。.NET 4.0 と 3.5 の両方で同じコードを実行しました。Fiddlerのおかげで、各リクエストは次のように表示されます。

POST someurl HTTP/1.1
Accept : application/xml;q=0.9, / ;q=0.8
Content-Type : application/x-www-form-urlencoded
Host : someurl
Content-Length : 12
Expect : 100-continue
Connection : Keep-生きている

text=DoStuff

于 2012-07-03T23:06:08.333 に答える
0

ILSpyを使用してexeファイルのILコードを比較します。
たぶん、このレベルでの検査は、バージョン間で物事がどこで異なるかについての考えをあなたに与えるでしょう。

于 2012-07-04T08:58:48.277 に答える