いつもROMですがお世話になっております。
XMLHttpを使ってXMLファイルをサーバに送信したいのですが、
ファイルサイズが1MB以内でないとエラーになってしまいました。
20MB超になることがあるこのファイルをできれば一発で送信したいのですが、
1MBという制限はどの部分で設定されているものなのかご教示お願いいたします。
サーバ側はWindows2003で、ASP.NETのページPOSTしています
-------------以下ソース
Dim oHttp As New MSXML2.XMLHTTP
Dim sURI As String
sURI = "http://〜〜〜/receiver.aspx"
Dim doc As New DOMDocument
doc.Load ("C:\〜〜〜\Data.xml")
oHttp.Open "POST", sURI, False
oHttp.send doc 'Sendで落ちる
この手の話は、他にもあったのですが、適切な解決策は
見つけていません・・・
http://support.microsoft.com/default.aspx?scid=kb;ja;311730
こちらよりは、
http://support.microsoft.com/default.aspx?scid=kb;ja;303326
こちらの方が、関係しているのでは・・・と思いますが・・・
それと、サーバー側の問題の場合も想定されますが、クライアント側
のMSXMLパーサーのバージョンの問題もあるようです。
ご確認下さい。
以上。
ありがとうございます。
アップロード時のみならず、ファイルが大容量になった場合のダウンロード時にも、原因がよくわからないエラーが出るようになってしまいました
だいぶ調べたんですけどあまり時間もないので、今回の案件ではファイルを分割して対処することにします。
MSXMLパーサのバージョンの問題は私も聞いたことがあったので、MSDNで調べたんですが具体的なことを見つけることができませんでした。
何か手がかりありませんかね…
普段、(ASP.NET ではなく)ASP を相手に XMLHTTPを利用していますが、
・数十バイト〜500KB程度のタブ区切りデータ(Lf改行)を、
XHTMLページ中のJScriptより、XMLHTTP.send()でASPなサーバに送信する。
・IISサーバ上に保存されている、300KB〜6MB程度のXMLファイル(UTF-8)を、
クライアントのWSFファイル中のVBScriptにて、XMLHTTP.send()で受信する。
といった処理を、問題なく行えています。(httpでもhttpsでも)
使用しているパーサは、サーバ/クライアント共に MSXML4 SP2。
OSは、サーバがWin2000、クライアントはNT4/98/98SE/2000/XPです。
> よくわからないエラーが
どのコードを実行した時に、何というエラーになったのでしょう?
ええとですね、受信側はこんな感じです。
Dim oHttp As New MSXML2.XMLHTTP
Dim sURI As String
sURI = "http://〜〜〜/requestfile.aspx"
Dim doc As New DOMDocument
doc.Load ("C:\〜〜〜\postdoc.xml")
oHttp.Open "POST", sURI, False
oHttp.send doc
Dim oADOStream As New ADODB.stream
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write(oHttp.responseBody)
oADOStream.SaveToFile distpath, 2
oADOStream.close
クライアント側のsendメソッドで、色々と引数の入ったXMLファイル(4KBほど)をPOSTして、15MB程度のXMLファイルを受信しようとした場合に、エラーの画面のソースが保存されます。
>次のエラーが発生しました:
>受信処理中にエラーが発生しました.
>システムが以下のエラーを返しました:
> (104) Connection reset by peer
>ネットワークからデータを受信している間にエラーが発生しました.再度リクエストしてください.
原因を探っている間に、同じ条件でも一時は受信が成功することもありましたが、現在はダメなようです。
動的に生成するのではなくあらかじめ用意した15MBのXMLファイルや、生成するデータをResponse.Writeせずそのままサーバ側に保存するのは成功したり、
POSTするXMLファイルが3KB、生成されるXMLファイルが10MB程度なら常に正常に受信できるようなので余計に腑に落ちません。
エラーの発生状況すら特定できてません…
> oADOStream.Write(oHttp.responseBody)
サーバーがXML文書を返すのであれば、ADODB.Streamを経由せずとも、
oHttp.responseXML.save distpath
だけでファイルに保存できますよ。
> エラーの画面のソースが保存されます。
私にはそのメッセージが、ASP.NETが返すエラーなのか、それとも、中継サーバ
(プロキシやファイアウォール等)が返したエラーなのかは判断できませんが、
少なくとも、VB側ではなく「サーバ側からエラーが報告された」という事ですよね。
まず、サーバ側にデータが正しくPOSTされているかどうかを、InetSpy等で確認してみてください。
例えば、送信しているXMLそのものに問題があったりはしませんか?
(上記のコードだと、postdoc.xmlが読み込みが終わる前に送信される可能性がありそうです)
send自体には問題が無い様であれば、それをIISが正しく受け取れているかどうかを確認してみてください。
・Request.TotalBytesは、送信されたデータ量に等しいか?
・Requestストリームから、XMLデータを取り出せているか?
データまでは受け取れているようであれば、ASP.NETでの応答処理のプログラムに
問題が無いかを確認してみて下さい。
それも問題が無い様であれば、ネットワーク自体に問題が無いかどうかも確認してみてください。
ありがとうございます
今はこれを使う仕事から離れて別のことをしているのですが、いずれまた使うことがあると思いますのでその時確認してみます!