- - PR -
WindowsServer2003でEXCEL出力すると「サーバーによって例外が返されました。」のエラーが発生してしまいま
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-10-08 10:30
こんにちは。
現在ASP.NETでEXCELを出力させるアプリを開発しているのですが、ごくたまに 「サーバによって例外が返されました」というエラーが発生し困っております。 WINDOWS2000Serverでテストした際に全く起こらなかったのですが、 WINDOWSServer2003に移したところ、ごくたまにEXCEL出力時に 「サーバーによって例外が返されました。」というエラーが発生してしまいます。 エラー時のStackTraceをとってみると、 at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack) という風に出ていました。 内容からして遅延バインドを行っているせいかとは思うのですが、 事前バインドの処理にするとなぜかプロセスが落ちなくなってしまい、断念しています。 何か良い方法はないでしょうか? 下記にソースを添付します。 Dim objExcel As Object Dim objExcelBooks As Object Dim objExcelBook As Object Dim objExcelSheets As Object Dim objExcelSheet As Object Dim objExcelRange As Object Dim objExcelHpageBreaks As Object objExcel = CreateObject("Excel.Application") objExcelBooks = objExcel.WorkBooks objExcelBook = objExcelBooks.Open(ファイルパス) objExcelSheets = objExcelBook.Worksheets objExcelSheet = objExcelSheets("Sheet1") '改ページを入れます objExcelHpageBreaks = objExcelSheet.HPageBreaks objExcelRange = objExcelSheet.Range("A15") objExcelHpageBreaks.Add(objExcelRange) ClearObject(objExcelRange) ClearObject(objExcelHpageBreaks) ClearObject(objExcelSheets) ClearObject(objExcelSheet) 'ファイルの保存 objExcelBook.SaveAs(ファイルパス, -4143) objExcelBook.Close(False) ClearObject(objExcelBook) ClearObject(objExcelBooks) objExcel.quit() ClearObject(objExcel) 'ガーベージコレクション GC.Collect() Private Sub ClearObject(ByVal o As Object) Try If Not o Is Nothing Then Do While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) Loop End If Catch Finally o = Nothing End Try End Sub End Class | ||||||||
|
投稿日時: 2003-10-08 20:18
かどちんさん、こんばんは。
#回答ではないんですが...。 取り敢えず、以下のスレッド↓の、Jittaさんの書き込み(とリンク先)を読んでみて下さい。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6114&forum=7 | ||||||||
|
投稿日時: 2003-10-10 14:10
きくちゃんさん、アドバイスありがとうございます。
(遅レスになってしまってごめんなさい) >取り敢えず、以下のスレッド↓の、Jittaさんの書き込み(とリンク先)を読んでみて下さ>い。 >http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6114&forum=7 そのページは一応読んでいたのですが、なかなか理解しづらくて。。。 もっと勉強しないと駄目ですね。 現況ですが、事前バインドの件は解決(プロセスも落とせる)し、 事前バインドにすると、〜LateGet〜のエラーは発生しなくなりました。 が、またまた「サーバーによって例外が返されました」エラーが発生し、 今度はobjExcelBooks.Open(ファイルパス) のところで落ちているようです。 どうも教えていただいたページの↓ここら辺が怪しそうですね。 適切な設計を行った後は、エラー発生時のエラー処理を行うコードを慎重に記述して、問題を解決および問題発生を防止する必要があります。オプションの引数の値をコード中で確実に渡しているかどうかを確認します。値が見つからない場合または競合する場合に、Office からユーザーに対して詳細情報を確認するメッセージが表示されることがあります。 引数から調べてみます。 エラーがたまにしか起きないので確認が難しいですが。。。 | ||||||||
|
投稿日時: 2003-10-10 15:24
かどちんさん、こんにちは。
今回、発生している不具合の直接の原因が、件の記事で言われている問題と関係があるのかどうかは判りません。 が、例えば ExcelCreator .NET(発売が延びていたんですね)のような、サーバ上での実行時動作保証を謳っているコンポーネントを利用する、という手も検討しては如何でしょうか。 | ||||||||
|
投稿日時: 2003-10-10 16:00
MSの文書って、英語からの直訳という雰囲気でもないのに、わかりにくいですよね。英語で読むと、日本語に訳されていない部分があったり、係り受けがはっきりしてわかりやすかったりします。。。ん?
ASP.NETを動かすユーザaspnet、またはauthenticated usersにアクセス権限があるか、調べてみてください。 | ||||||||
|
投稿日時: 2003-10-13 15:26
きくちゃんさん、Jittaさんアドバイスありがとうございます。
>Jittaさん
Web.Configでユーザ偽装をして専用のユーザでExcel等の実行をしていて、DCOMCNFGで、そのユーザでのExcelへのアクセス権限を与えています。またFrameWorkのフォルダにはそのユーザと、ASPNETユーザに権限を与えているのですが。。。 2003Serverは権限に関しては厳しいようで色々と苦労しましたが、もし権限がなかったら常にエラーが出るのでは・・・と思います。 エラーがごくたまにしか起きなくて、検証しようにも出来ず、 なかなか打つ手がなくて困っております。。。 (objExcelBook.Open時のエラーもあれ以来起こっていないんです。はあ〜) >きくちゃんさん
本当、Officeのオートメーションはこれっきりにしたいですが。。。(色々と苦労したので)本番寸前なのでもう文句も言えません。とりあえず今回出ている気まぐれなエラーを なんとかして、次のときはExcelCreator .NETやら調べてもっと安全なものを提案できるようにしたいですね。 | ||||||||
|
投稿日時: 2003-10-14 08:49
オープンしようとしているファイルと、そのファイルがあるディレクトリ、およびその親階層、のつもりだったのですが・・・ 他のユーザで作ってあったのでエラーになった。エラーがでた後に消して再実行したところ、今度は自分で作るのでOkになった。ということはありませんか? FrameworkフォルダにはUsersグループにアクセス権限があるので、そのコンピュータのユーザとして登録されているユーザでアクセスするのであれば、特に問題はありません。 | ||||||||
|
投稿日時: 2003-10-14 16:43
Jittaさん色々とありがとうございます。
ファイル作成→オープン→加工→保存という処理を一貫して行っているのでユーザが異なる場合はないと思います(これは記述していませんでしたね。。。申し訳ないです。掲載したソースの前に「HTMLを読み込んでxls形式で保存」という処理を入れています) ファイル作成するフォルダ、親階層には専用のユーザが書き込みを含む権限を持っているのですが、ASPNETユーザが属するUSERSグループには読み込み権限までしか与えていません。ここら辺がまずいのでしょうか? ユーザ偽装をしているため、ASPNETユーザには特に権限は必要ないかと思っていたのですが・・・
2003ServerではFrameWorkフォルダ内のTemporaryフォルダにはデフォルトで書き込み権限がないため、付与してあげないとASP.NETは動かなかったような気がします(間違っていたらごめんなさい)。でもここでは関係ないですね。。。 |