2012-07-03 6 views
5

WebRequestで奇妙な問題や動作が発生しました。まず第一に、ここで私がやろうとしているものです:.NET 4.0でのみ動作するHttpWebRequest

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フレーム3.5セットを持つ:フレームワークを設定しながら

str2 = req.GetRequestStream() 

バージョン4.0は機能し、タイムアウトの問題はありません。誰がなぜこれが起こるのか知っていますか?私も3.0を試しましたが、それもうまくいきませんでした。

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

+2

[Fiddler](http://www.fiddler2.com/fiddler2/)のようなツールを使用して、リクエストの違いを確認してください。技術的には、要求が完全に同一であれば、リモートサーバーは異なる方法で応答できるように違いを知るべきではありません。いくつかの副次的な点でリクエストが異なっていたり、異なるフレームワークが同じレスポンスを2つの異なる方法で処理しています。 – mellamokb

+0

大丈夫、私は最初のステップでフィドラーを試してみます。そのヒントをありがとう – inva

+0

'req.Timeout'をあなたが経験しているタイムアウト値よりも高い値に設定した場合、動作しますか? +1しても、実際にリクエストを送信しているかどうか、それと何か相違があるかどうかを確認できます。 – greg84

答えて

2

私の推測では、あなたはまだ処分されていないオープン座って他のいくつかの要求を持っています。可能であれば、usingステートメントを使用するようにコードを更新してください(IDisposableを実装するオブジェクトを扱う場合は常にこれを使用してください)。

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

これは、次のストリームに移動する前にすべてのストリームが確実に閉じられるようにします。

更新

は、これは間違いなく、.NET Frameworkの切り替えの問題ではないですが、私は小さなコンソールアプリケーションにコードをサンドボックスとは明らかに異なるためにあなたのURLを切り替える(以下のようにコードを再書い1つ):

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
を受け入れ:アプリケーション/ XMLを、Q = 0.9、/; Q = 0.8
のContent-Type :アプリケーション/ x-www-form-urlencodedで
ホスト:someurl
のContent-Length:12
期待:キープアライブ

テキスト= DoStuff

+0

私は今これを試してみるが、実際にはこのようなものは一般的には良いアイデアだ。しかし、私が言ったように、バージョン4.0の作品を使用して4.0未満のバージョンは、要求を送信します:( – inva

+0

このラッピングのアイデアを使用して私の問題を解決しない - 私は任意のオープン要求があることを把握することはできません。さらに、lock()ステートメント(またはVb.netのSyncLock)を使って私のコックを包んだが、これも役に立たなかった。 – inva

+0

@inva最後のステートメントをもう一度読み直したいかもしれない。私の答えを更新し、それが問題を解決するかどうかを確認してください。あなたのinitalコードは、(例外の結果であっても)ストリームを開いたままにして、スレッドプールの接続が不足してサービスを提供できませんでした。 – James

0

私はILSpyを使用して、EXEファイルのILコードを比較します:
接続を100-続けます。
このレベルの検査では、バージョン間で状況が異なる場合があります。