httpwebrequestで「基礎となる接続が閉じられました」
-
29-09-2019 - |
質問
vb.netで書かれたアプリケーションがあります(いいえ ASP.NET、Windowsコンソールアプリです)。私はURL(HTMLページ)を呼び出して、応答を文字列に戻そうとしています。応答はストレートJSONで、HTMLタグはまったくありません。で開きます {
そして閉じます }
.
HTTPWEBREQUESTオブジェクトを正常に作成します。次に、電話します req.GetResponse()
. 。これを行うとすぐにエラーが発生します The underlying connection was closed: The connection was closed unexpectedly.
私はグーグルでStackoverflowをグーグルで調べてチェックしており、適用されるすべてのものを試してみました(その多くは、適用されない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
コメントアウトライン(間違ったコメントスタイルがありますが、それを解析するように)は、私がオンラインで見つけたものに基づいてこれまでに試したすべてのことです。それらのどれもそれを修正しませんでした。構築されているURLが正しいことを確認しました。ブラウザでまったく同じURLを呼び出すと、正しい期待される応答が正確に戻されます。
私はそれをwiresharkingに試してみました...そして、私は実際に予想される、完全なデータがサメの出力に戻ってきてから、数回の行、そして次のような赤い線を見ています。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トレースの両方が実際にすべてのデータを表示します は 戻ってきて、フレームワークは、すべてのデータを受け取った後のことを除いて、何らかの理由であります!
WebException自体は非常に役に立たない。そのinrerexceptionはnullであり、そのステータスは「connectionclosed {8}」と言っているだけだった。
前もって感謝します!!!
更新08/18 1130: 私も今使用してみました System.Net.WebRequest
とは対照的に HttpWebRequest
. 。これも違いを生みませんでした。
更新08/18 1222: 使用する代わりにコードを切り替えようとしました [Http]Web[Request|Response]
aを暗くする WebClient
代わりにオブジェクトを使用します DownloadString()
方法。しかし、これ また まったく正確なエラーをスローします。
更新08/18 1230: 使用してみました My.Computer.Network.DownloadFile()
- 同じ接続クローズドエラーも取得します。
解決
Pastebin.comのTraceログの内容全体を投稿して、ここにリンクを投稿できますか?
サーバーは「コンテンツ長」ヘッダーで、エンティティのnバイトを送信しているが、実際にはnバイト未満と接続を閉じることを「コンテンツ長」ヘッダーに言う可能性があるため、この例外を取得している可能性があります。
答え:
データをありがとう。 TracelogおよびWireshark Traceから、サーバーは応答ヘッダーを送信しておらず、データを直接送信しているようです。これはHTTPプロトコル違反です。そのため、クライアントが例外をスローしているのです。
他のヒント
これが私がそれを機能させた方法です...正しい方向に私を向けてくれた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
これは私を助けます。それが誰かにも役立つことを願っています。
httpwebrequestオブジェクトを作成した直後、この行を追加します。
System.net.ServicePointManager.SecurityProtoCol = System.Net.SecurityProtoColtype.ssl3;
それが意味するのは、セキュリティプロトコルとしてSecure Socket Layer(SSL)3.0を指定することです
リクエストの遅延を確認してください。それが数ミリ秒以上の場合、それはナグルアルゴリズムを無効にする価値があります
ServicePointManager.UseNagleAlgorithm = false;
私は身体のないリクエストに関して同じ問題を抱えていました。私の場合、設定します ContentLength
ゼロに問題を修正しました。
私の場合、問題は「https://」の代わりに「http:// ..」をサービスアドレスとして使用したことでした。