Web ページからデータを取得する .net 3.5 コンソール アプリケーションを作成しました。Windows 7 開発マシンでデバッグして実行すると、問題なく動作します。
しかし、Debian 6.0.5 および Mono 2.6.7 を実行しているホストされた VPS で実行すると、2 回目以降の呼び出しで次の例外がスローされます。UploadString()
System.Net.WebException: Error getting response stream (ReadDone2): ReceiveFailure ---> System.Exception: at System.Net.WebConnection.HandleError(WebExceptionStatus st, System.Exception e, System.String where)
at System.Net.WebConnection.ReadDone(IAsyncResult result)
at System.Net.Sockets.Socket+SocketAsyncResult.Complete()
at System.Net.Sockets.Socket+Worker.Receive()
at System.Net.WebConnection.HandleError (WebExceptionStatus st, System.Exception e, System.String where) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0
at System.Net.WebClient.GetWebResponse (System.Net.WebRequest request) [0x00000] in <filename unknown>:0
at System.Net.WebClient.ReadAll (System.Net.WebRequest request, System.Object userToken) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadDataCore (System.Uri address, System.String method, System.Byte[] data, System.Object userToken) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadData (System.Uri address, System.String method, System.Byte[] data) [0x00000] in <filename unknown>:0
私のコードは非常に単純です (完了したら webclient を破棄する try/catch/finally があります)
client = new WebClient();
client.Proxy = null;
client.Credentials = new NetworkCredential("xxx", "xxx");
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
string postString = "";
foreach (KeyValuePair<string, string> pair in postData)
{
postString += pair.Key + "=" + pair.Value + "&";
}
string content = client.UploadString(url, postString);
return content;
上記のコードはメソッドにラップされており、データのリストを取得するために何度も呼び出されます。最初の呼び出しは常に成功します。2 回目以降の呼び出しでUploadString()
は、30 秒間ブロックされた後、上記の例外が発生します。コンソール出力を見て、これに気づきました。ループで実行したままにしておくと、数回試行した後、成功してから繰り返し失敗します。
同様のコードを持つ別のメソッドがありますが、OpenRead()
代わりに呼び出してコンテンツを返します。これは、私の VPS では問題なく実行されます。また、VPS でホストされている 2 つの PHP5 Web アプリケーションがあり、問題なく実行されています。
私の VPS は X11 をサポートしていないため、VS2010 を使用してコードをリモートでデバッグする方法がわかりません (または、MonoDevelop を使用する必要があります)。以前に同様の問題に遭遇したことがある人に、これに対する回答、またはこの同様のセットアップをデバッグするためのガイドがあることを願っています。
同様の質問が あります。ありがとう
編集: 開発マシンで MonoDevelop を実行してデバッグできることに気がつきませんでした。今それをします。
編集: Windows で MonoDevelop + Mono 2.6.7 を使用してデバッグしようとすると、さまざまな問題が発生し、MySQL.Data がサーバーに接続できず、WebClient でタイムアウト エラーが発生します。
私は HttpWebRequest を使用することに頼っていますが、VPS で実行しているときに同様の例外が発生しますが、自分のマシンでは発生しません。
System.Net.WebException: Error getting response stream (ReadDone2): ReceiveFailure ---> System.Exception: at System.Net.WebConnection.HandleError(WebExceptionStatus st, System.Exception e, System.String where)
at System.Net.WebConnection.ReadDone(IAsyncResult result)
at System.Net.Sockets.Socket+SocketAsyncResult.Complete()
at System.Net.Sockets.Socket+Worker.Receive()
at System.Net.WebConnection.HandleError (WebExceptionStatus st, System.Exception e, System.String where) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0
HttpWebRequest は実際には WebClient 内で使用されるため、同じ例外を取得することは合理的と思われます。
編集: Mono 2.10.8 をコンパイルして実行できるようになった後、別の例外が発生します。チャンク転送エンコーディングに関連しているかどうかはわかりませんが、Windows でデバッグしてもそのようなエラーは発生しません。
System.Net.WebException: An error occurred performing a WebClient request. ---> System.Net.ProtocolViolationException: The number of bytes to be written is greater than the specified ContentLength.
at System.Net.WebConnectionStream.CheckWriteOverflow (Int64 contentLength, Int64 totalWritten, Int64 size) [0x00000] in <filename unknown>:0
at System.Net.WebConnectionStream.BeginWrite (System.Byte[] buffer, Int32 offset, Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in <filename unknown>:0
at System.Net.WebConnectionStream.Write (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadDataCore (System.Uri address, System.String method, System.Byte[] data, System.Object userToken) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadData (System.Uri address, System.String method, System.Byte[] data) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Net.WebClient.UploadData (System.Uri address, System.String method, System.Byte[] data) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadData (System.Uri address, System.Byte[] data) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadData (System.String address, System.Byte[] data) [0x00000] in <filename unknown>:0
at System.Net.WebClient.UploadString (System.String address, System.String data) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Net.WebClient:UploadString (string,string)
編集: をProtocolViolationException
使用している場合は取得しますが、WebClient
取得しますReceiveFailure
。これは、すべて Mono 2.10.8 で HttpWebRequest を使用している場合、以前と同じ例外です。