C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: GetResponse による500エラー


(過去ログ 105 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■62773 / inTopicNo.1)  GetResponse による500エラー
  
□投稿者/ ぱち (3回)-(2011/11/01(Tue) 22:09:03)

分類:[.NET 全般] 

現在Web上のaspxに、ファイル及び複数の設定情報をpostするアプリケーションを、VS2008,C#にて作成しております。
DOBON.NET様のサイト(http://dobon.net/vb/dotnet/internet/webrequestpost.html)を参考に
次のように作成してみました。

-----------ソース--------------

//文字コード
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8");
//WebRequestの作成
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL);
//メソッドにPOSTを指定
req.Method = "POST";

//区切り文字列
string boundary = System.Environment.TickCount.ToString();
//ContentTypeを設定
req.ContentType = "multipart/form-data; boundary=" + boundary;

//POST送信するデータを作成
string postData = "";
postData = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"AAA\"" + "\"\r\n\r\n" +
HttpUtility.UrlEncode(TEXT, enc) +
"\r\n" +
"--" + boundary + "\r\n" +

"Content-Disposition: form-data; name=\"BBB\"" + "\"\r\n\r\n" +
System.Web.HttpUtility.UrlEncode(TEXT, enc) +
"\r\n" +
"--" + boundary + "\r\n" +

"Content-Disposition: form-data; name=\"CCC\"" + "\"\r\n\r\n" +
HttpUtility.UrlEncode(TEXT, enc) +
"\r\n" +
"--" + boundary + "\r\n" +

"Content-Disposition: form-data; name=\"DDD\"" + "\"\r\n\r\n" +
HttpUtility.UrlEncode(TEXT, enc) +
"\r\n" +
"--" + boundary + "\r\n" +

// ファイルはバイナリで送る
"Content-Disposition: form-data; name=\"upfile\"; filename=\"" +
HttpUtility.UrlEncode(FILENAME, enc) + "\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"Content-Transfer-Encoding: binary\r\n\r\n";

//バイト型配列に変換
byte[] startData = enc.GetBytes(postData);
postData = "\r\n--" + boundary + "--\r\n";
byte[] endData = enc.GetBytes(postData);

//送信するファイルを開く
System.IO.FileStream fs = new System.IO.FileStream(FILENAME, System.IO.FileMode.Open, System.IO.FileAccess.Read);

//POST送信するデータの長さを指定
req.ContentLength = startData.Length + endData.Length + fs.Length;

//データをPOST送信するためのStreamを取得
System.IO.Stream reqStream = req.GetRequestStream();

//送信するデータを書き込む
reqStream.Write(startData, 0, startData.Length);

//ファイルの内容を送信
byte[] readData = new byte[0x1000];
int readSize = 0;
while (true)
{
readSize = fs.Read(readData, 0, readData.Length);
if (readSize == 0)
break;
reqStream.Write(readData, 0, readSize);
}
fs.Close();

reqStream.Write(endData, 0, endData.Length);

reqStream.Close();


//サーバーからの応答を受信するためのWebResponseを取得
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
★ここで、エラーが発生します★

--------------------ソース----------------------

Exception.Messageは「リモート サーバーがエラーを返しました: (500) 内部サーバー エラーです」
と出ます。
メッセージをググったところ、ファイルサイズが大きい場合に出る、という記述を残した方がおりましたが、
技術文書などは見つけるに至れませんでした。
送るファイルはCSVファイルなのですが、確かにテストで使っている20000レコード(6.6MB)では
確実にエラーがでるものの、5000レコード(1.7MB)ではエラーは発生しません。

本件、ソースの修正等の対応で対処できるものなのでしょうか。
おはずかしながら、原因が特定できず上記の検討が行えません・・・。
どうぞ原因のご指摘と、出来れば解決策やヒント・参考となるサイトの情報などをよろしくお願いいたします。
引用返信 編集キー/
■62776 / inTopicNo.2)  Re[1]: GetResponse による500エラー
□投稿者/ 魔界の仮面弁士 (2399回)-(2011/11/01(Tue) 23:40:22)
No62773 (ぱち さん) に返信
> Exception.Messageは「リモート サーバーがエラーを返しました: (500) 内部サーバー エラーです」
> と出ます。
リクエスト内容に問題がある場合は400番台のエラー。(404 not found など)
サーバー内で発生したエラーは 500 番台のエラーですね。

より具体的な内容が知りたい場合には、サーバー側の管理者に頼んで、
アクセスログに追加情報が記録されるように設定してもらうか、
あるいは詳細なエラー情報も返却されるようにする必要があるかもしれません。


> 送るファイルはCSVファイルなのですが、確かにテストで使っている20000レコード(6.6MB)では
> 確実にエラーがでるものの、5000レコード(1.7MB)ではエラーは発生しません。
サイズが原因の場合、自身が管理しているサーバーであれば、たとえば
 (案1) 分割送信できる仕組みを利用もしくは構築する。
 (案2) データ転送のサイズ上限設定を緩和する。
 (案3) 別の送出方法を検討する。(FTP 等)
といった対処法になるかと思います。
(サーバー製品によって、手順や設定方法の差はありますが)

ただし、無暗に制限を緩めると DoS 攻撃に弱くなったりもしますので、適宜調整が必要です。
http://www.atmarkit.co.jp/fjava/rensai2/webopt13/webopt13.html

なお案2 については、サーバーが IIS の場合は、
 AspMaxRequestEntityAllowed
のメタベース設定で調整できます。それでも 70MB あたりが限界のようですが。
引用返信 編集キー/
■62781 / inTopicNo.3)  Re[2]: GetResponse による500エラー
□投稿者/ ぱち (5回)-(2011/11/02(Wed) 10:38:38)
魔界の仮面弁士 様

早速の回答、さらには対応手法まで提示いただき、ありがとうございます。

サーバー側でエラー返却の環境を構築するのは、原因の確認では
一番適切な手法かと思いますので、早速行ってみたいと思います。
その上で、ご提示いただいた案のどれが適切な対応となりうるか、
検討いたします。

> なお案2 については、サーバーが IIS の場合は、
>  AspMaxRequestEntityAllowed
> のメタベース設定で調整できます。それでも 70MB あたりが限界のようですが。
なるほど・・・iis7なんですが、これも204800バイトがデフォルトみたいですね。
こちらも確認させていただきます。

進展もしくは新たな疑問がありましたら、別スレにて立てさせていただきます。

誠にありがとうございました。




No62776 (魔界の仮面弁士 さん) に返信
> ■No62773 (ぱち さん) に返信
>>Exception.Messageは「リモート サーバーがエラーを返しました: (500) 内部サーバー エラーです」
>>と出ます。
> リクエスト内容に問題がある場合は400番台のエラー。(404 not found など)
> サーバー内で発生したエラーは 500 番台のエラーですね。
>
> より具体的な内容が知りたい場合には、サーバー側の管理者に頼んで、
> アクセスログに追加情報が記録されるように設定してもらうか、
> あるいは詳細なエラー情報も返却されるようにする必要があるかもしれません。
>
>
>>送るファイルはCSVファイルなのですが、確かにテストで使っている20000レコード(6.6MB)では
>>確実にエラーがでるものの、5000レコード(1.7MB)ではエラーは発生しません。
> サイズが原因の場合、自身が管理しているサーバーであれば、たとえば
>  (案1) 分割送信できる仕組みを利用もしくは構築する。
>  (案2) データ転送のサイズ上限設定を緩和する。
>  (案3) 別の送出方法を検討する。(FTP 等)
> といった対処法になるかと思います。
> (サーバー製品によって、手順や設定方法の差はありますが)
>
> ただし、無暗に制限を緩めると DoS 攻撃に弱くなったりもしますので、適宜調整が必要です。
> http://www.atmarkit.co.jp/fjava/rensai2/webopt13/webopt13.html
>
> なお案2 については、サーバーが IIS の場合は、
>  AspMaxRequestEntityAllowed
> のメタベース設定で調整できます。それでも 70MB あたりが限界のようですが。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -