- PR -

WindowsServer2003でEXCEL出力すると「サーバーによって例外が返されました。」のエラーが発生してしまいま

投稿者投稿内容
かどちん
会議室デビュー日: 2003/09/21
投稿数: 5
投稿日時: 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/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-10-08 20:18
かどちんさん、こんばんは。

#回答ではないんですが...。

取り敢えず、以下のスレッド↓の、Jittaさんの書き込み(とリンク先)を読んでみて下さい。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6114&forum=7
かどちん
会議室デビュー日: 2003/09/21
投稿数: 5
投稿日時: 2003-10-10 14:10
きくちゃんさん、アドバイスありがとうございます。
(遅レスになってしまってごめんなさい)

>取り敢えず、以下のスレッド↓の、Jittaさんの書き込み(とリンク先)を読んでみて下さ>い。
>http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6114&forum=7

そのページは一応読んでいたのですが、なかなか理解しづらくて。。。
もっと勉強しないと駄目ですね。

現況ですが、事前バインドの件は解決(プロセスも落とせる)し、
事前バインドにすると、〜LateGet〜のエラーは発生しなくなりました。

が、またまた「サーバーによって例外が返されました」エラーが発生し、
今度はobjExcelBooks.Open(ファイルパス) のところで落ちているようです。

どうも教えていただいたページの↓ここら辺が怪しそうですね。
適切な設計を行った後は、エラー発生時のエラー処理を行うコードを慎重に記述して、問題を解決および問題発生を防止する必要があります。オプションの引数の値をコード中で確実に渡しているかどうかを確認します。値が見つからない場合または競合する場合に、Office からユーザーに対して詳細情報を確認するメッセージが表示されることがあります。

引数から調べてみます。
エラーがたまにしか起きないので確認が難しいですが。。。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-10-10 15:24
かどちんさん、こんにちは。

引用:

そのページは一応読んでいたのですが、なかなか理解しづらくて。。。


今回、発生している不具合の直接の原因が、件の記事で言われている問題と関係があるのかどうかは判りません。
が、例えば ExcelCreator .NET(発売が延びていたんですね)のような、サーバ上での実行時動作保証を謳っているコンポーネントを利用する、という手も検討しては如何でしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-10 16:00
引用:

かどちんさんの書き込み (2003-10-10 14:10) より:

そのページは一応読んでいたのですが、なかなか理解しづらくて。。。
もっと勉強しないと駄目ですね。


 MSの文書って、英語からの直訳という雰囲気でもないのに、わかりにくいですよね。英語で読むと、日本語に訳されていない部分があったり、係り受けがはっきりしてわかりやすかったりします。。。ん?


引用:

が、またまた「サーバーによって例外が返されました」エラーが発生し、
今度はobjExcelBooks.Open(ファイルパス) のところで落ちているようです。


 ASP.NETを動かすユーザaspnet、またはauthenticated usersにアクセス権限があるか、調べてみてください。
かどちん
会議室デビュー日: 2003/09/21
投稿数: 5
投稿日時: 2003-10-13 15:26
きくちゃんさん、Jittaさんアドバイスありがとうございます。

>Jittaさん

引用:
ASP.NETを動かすユーザaspnet、またはauthenticated usersにアクセス権限があるか、
調べてみてください。



Web.Configでユーザ偽装をして専用のユーザでExcel等の実行をしていて、DCOMCNFGで、そのユーザでのExcelへのアクセス権限を与えています。またFrameWorkのフォルダにはそのユーザと、ASPNETユーザに権限を与えているのですが。。。
2003Serverは権限に関しては厳しいようで色々と苦労しましたが、もし権限がなかったら常にエラーが出るのでは・・・と思います。
エラーがごくたまにしか起きなくて、検証しようにも出来ず、
なかなか打つ手がなくて困っております。。。
(objExcelBook.Open時のエラーもあれ以来起こっていないんです。はあ〜)

>きくちゃんさん

引用:
今回、発生している不具合の直接の原因が、件の記事で言われている問題と関係があるのかどうかは判りません。
が、例えば ExcelCreator .NET(発売が延びていたんですね)のような、サーバ上での実行時動作保証を謳っているコンポーネントを利用する、という手も検討しては如何でしょうか。



本当、Officeのオートメーションはこれっきりにしたいですが。。。(色々と苦労したので)本番寸前なのでもう文句も言えません。とりあえず今回出ている気まぐれなエラーを
なんとかして、次のときはExcelCreator .NETやら調べてもっと安全なものを提案できるようにしたいですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-14 08:49
引用:

かどちんさんの書き込み (2003-10-13 15:26) より:

Web.Configでユーザ偽装をして専用のユーザでExcel等の実行をしていて、DCOMCNFGで、そのユーザでのExcelへのアクセス権限を与えています。またFrameWorkのフォルダにはそのユーザと、ASPNETユーザに権限を与えているのですが。。。


 オープンしようとしているファイルと、そのファイルがあるディレクトリ、およびその親階層、のつもりだったのですが・・・
 他のユーザで作ってあったのでエラーになった。エラーがでた後に消して再実行したところ、今度は自分で作るのでOkになった。ということはありませんか?

 FrameworkフォルダにはUsersグループにアクセス権限があるので、そのコンピュータのユーザとして登録されているユーザでアクセスするのであれば、特に問題はありません。
かどちん
会議室デビュー日: 2003/09/21
投稿数: 5
投稿日時: 2003-10-14 16:43
Jittaさん色々とありがとうございます。

引用:
オープンしようとしているファイルと、そのファイルがあるディレクトリ、およびその親階層、のつもりだったのですが・・・
 他のユーザで作ってあったのでエラーになった。エラーがでた後に消して再実行したところ、今度は自分で作るのでOkになった。ということはありませんか?



ファイル作成→オープン→加工→保存という処理を一貫して行っているのでユーザが異なる場合はないと思います(これは記述していませんでしたね。。。申し訳ないです。掲載したソースの前に「HTMLを読み込んでxls形式で保存」という処理を入れています)

ファイル作成するフォルダ、親階層には専用のユーザが書き込みを含む権限を持っているのですが、ASPNETユーザが属するUSERSグループには読み込み権限までしか与えていません。ここら辺がまずいのでしょうか?
ユーザ偽装をしているため、ASPNETユーザには特に権限は必要ないかと思っていたのですが・・・

引用:
FrameworkフォルダにはUsersグループにアクセス権限があるので、そのコンピュータのユーザとして登録されているユーザでアクセスするのであれば、特に問題はありません。


2003ServerではFrameWorkフォルダ内のTemporaryフォルダにはデフォルトで書き込み権限がないため、付与してあげないとASP.NETは動かなかったような気がします(間違っていたらごめんなさい)。でもここでは関係ないですね。。。

スキルアップ/キャリアアップ(JOB@IT)