9

VB.NETで記述されたアプリケーションがあります(asp.netではなく、Windowsコンソールアプリです)。URL(htmlページ)を呼び出して、応答を文字列に戻そうとしています。応答はストレートJSONであり、htmlタグは一切ありません。で開き、{で閉じます}

HttpWebRequestオブジェクトを正常に作成します。次に、を呼び出しますreq.GetResponse()。これを行うとすぐに、私はThe underlying connection was closed: The connection was closed unexpectedly.グーグルしてスタックオーバーフローをチェックしているというエラーを受け取り、適用されることがわかったすべてを試しました(多くは適用されないWCFサービス構成に関係しています)。

これが私のコードです:

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        d.Url = "http://" & d.IpAddress & ini.doc.<svc>.<url>.Value

        Dim req As HttpWebRequest = HttpWebRequest.Create(d.Url)
        // req.Accept = "*/*"
        // req.Timeout = 30000
        // req.ReadWriteTimeout = 30000
        // req.KeepAlive = False
        // req.UseDefaultCredentials = True
        // req.CachePolicy = HttpWebRequest.DefaultCachePolicy
        // req.Proxy = HttpWebRequest.DefaultWebProxy
        // req.ProtocolVersion = New System.Version(1, 0)

        Dim rsp As HttpWebResponse = req.GetResponse()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    Finally
        rsp = Nothing
        req = Nothing
    End Try
End Function

コメントアウトされた行(コメントスタイルは間違っていますが、SOは正しく解析します)は、オンラインで見つけたものに基づいてこれまでに試したすべてのものです。それらのどれもそれを修正しませんでした。作成中のURLが正しいことを確認しました。ブラウザでまったく同じURLを呼び出すと、期待どおりの正しい応答が返されます。

私はそれをワイヤーシャークしてみました...そして実際に期待される完全なデータがシャークの出力に戻ってきて、それから数行、そして次のような赤い線が表示されます: http > 51943 [RST] Seq=1607 Win=0 Len=0これは.NETの前に表示される最後の行ですエラーをスローしています。

System.Netまた、SOの投稿ごとにトレース/ログをオンにしてみました。そこからの出力ファイルでは、同様に期待されるすべてのJSONデータが返されますが、戻った後、.NETトレースログに次の行がスローされます。

System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 1605#1605
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Receive()
System.Net.Sockets Verbose: 0 : [7040] Data from Socket#60467532::Receive
System.Net.Sockets Verbose: 0 : [7040] 00000000 :                                                 : 
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 0#0
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Dispose()
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816:: - The underlying connection was closed: The connection was closed unexpectedly.
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816::GetResponse - The underlying connection was closed: The connection was closed unexpectedly.

これを理解するために次にどこに行くべきかについてのアイデアはありますか?私たちはいくつかの環境監視センサーデバイスからこのデータを読み取っています、そして彼らは私たちに使用するためにこのURLを与えました。

これについて本当に私を混乱させて混乱させる2つのことは、 a)
ブラウザで呼び出されたときに完全に正常に動作する
b)WireSharkと.NETトレースの両方で、すべてのデータが実際に戻ってきていることを示しフレームワークは何らかの理由でAFTERを除くすべてのデータを受信します!

WebException自体はほとんど使用されていません。InnerExceptionがnullであり、ステータスが「ConnectionClosed{8}」とだけ表示されているためです。

前もって感謝します!!!

UPDATE 08/18 1130:私も今ではなくを使用してみSystem.Net.WebRequestましたHttpWebRequest。これも違いはありませんでした。

UPDATE 08/18 1222:オブジェクト[Http]Web[Request|Response]を調光してそのメソッドを使用する代わりに、コードを切り替えてみました。ただし、これまったく同じエラーをスローします。WebClientDownloadString()

UPDATE 08/18 1230: -を使用してみMy.Computer.Network.DownloadFile()ましたが、同じ接続が閉じられたというエラーも発生します。

4

6 に答える 6

5

トレースログの内容全体をpastebin.comに投稿し、ここにリンクを投稿できますか?

サーバーが「Content-Length」ヘッダーでNバイトのエンティティを送信していると言っているが、実際にはNバイト未満を送信して接続を閉じているため、この例外が発生する可能性があります。

答え:

データをありがとう。tracelogとwiresharkトレースから、サーバーは応答ヘッダーを送信しておらず、データを直接送信しているようです。これはHTTPプロトコル違反です。これが、クライアントが例外をスローしている理由です。

于 2010-08-17T20:33:13.030 に答える
4

これは私を助けます。それが誰かにも役立つことを願っています。

HttpWebRequestオブジェクトを作成した直後に、この行を追加します。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;

これは、Secure Socket Layer(SSL)3.0をセキュリティプロトコルとして指定することを意味します

http://support.microsoft.com/kb/915599

于 2010-12-13T22:28:27.143 に答える
3

これが私がそれを機能させた方法です...私を正しい方向に向けてくれたferozeに感謝します!
(ポイント獲得)

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        Dim tcp = New TcpClient()
        tcp.Connect(d.IpAddress, 80)

        Dim ns = tcp.GetStream()

        Dim req As Byte() = System.Text.Encoding.ASCII.GetBytes(
            "GET /getdata.htm HTTP/1.1" & vbCrLf & vbCrLf
        )
        ns.Write(req, 0, req.Length)

        Dim rsp(2048) As Byte, rcv As Integer
        Do
            rcv = ns.Read(rsp, 0, rsp.Length)
            d.JSON &= System.Text.Encoding.ASCII.GetString(rsp, 0, rcv)
        Loop Until rcv = 0

        tcp.Close()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    End Try
End Function
于 2010-08-19T20:22:38.237 に答える
0

リクエストのレイテンシを確認してください。数ミリ秒を超える場合は、Nagleアルゴリズムを無効にする価値があります

 ServicePointManager.UseNagleAlgorithm = false;
于 2014-02-06T19:33:11.267 に答える
0

私は体のない要求に関して同じ問題を抱えていました。私の場合、ContentLengthをゼロに設定すると問題が解決しました。

于 2014-10-03T18:37:15.967 に答える
0

私の場合、問題は「https://」の代わりに「http://..」をサービスアドレスとして使用したことでした...

于 2017-01-25T20:22:52.027 に答える