- - PR -
WindowsアプリからWebサービスでEXCELダウンロード
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-27 13:09
Excel:2003
C# WinXP-pro VS2003 いつも参考にさせていただいております。 以前、こちらを参考&アドバイスを頂き、 WEBアプリにてEXCELファイルのダウンロードを行っておりました。 今回、Windowsアプリ(スマートクライアントではありません)で WebサービスにてEXCELのダウンロードを行いたいという要望がありまして調査中です。 とりあえず単純に、ASP.NETで処理していた部分をWebサービス側に持って来ました。 [Webサービス] TestService.asmx ------------------------------------------- [WebMethod] public string test() { System.IO.FileInfo fileInfo = new System.IO.FileInfo("D:/test.xls"); long nSize = fileInfo.Length; Context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis"); Context.Response.ContentType = "application/octet-stream-dummy"; Context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + "test.xls"); Context.Response.WriteFile(fileInfo.FullName, 0, nSize); Context.Response.Flush(); Context.Response.Close(); return "OK"; // リターンは返す必要がないかもしれません } Windowsアプリ側 ------------------------------------------- using Client.TestHost; // Web参照 TestService service = new TestService(); string ff = service.test(); ------------------------------------------- Webサービスのみをテストで起動すると、ダウンロードを促す画面が表示され、 [開く]ボタンをクリックすると指定したEXCELファイルが表示されました。 このWebサービスをWindowsアプリから呼んでみたのですが、 VSのWebReferenceのSystem.Web.Services.Protocols.SoapDocumentMethodAttribute属性の部分で、 「System.ArgumentOutOfRangeException' のハンドルされていない例外が mscorlib.dll で発生しました。 追加情報 : 負の値ではない数値が必要です」 となってしまいます。 そもそもこの方法でうまくいくのかもわからず、 とりあえず手をつけ始めている次第です。 どなたかアドバイスいただけないでしょうか? よろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-10-27 15:44
こんにちは。
なんかWebサービスの作り方が間違っているような。。。 (といっても自分も詳しくないですが) Webサービスで公開するメソッドが返すデータは、Responseオブジェクトで返すような作りにするのではなく、通常のメソッドと同様にreturnで返すべきものだと思います。 (いや、ホントに詳しくないからResponseオブジェクトで返すことも可能かもしれないが) だからこの場合、ファイルを読み込んでそのデータ自体をreturnし、Windowsアプリケーション側で復元し保存してやればよいのだと思います。 以下未検証ですが、次のようなコードでいけるのではないかと。 Webサービス側
Windowsアプリ側
| ||||||||
|
投稿日時: 2005-10-27 16:37
noderaさん、早速のレスありがとうございます!
ばっちりです。 アドバイス通りで、ファイルのダウンロードができました。 確かにWebサービスのリターンについては強引でしたね。 Webサービス単体のテストでダウンロードダイアログが出てEXCELが表示されたので つい行けるかな?と思って試してみました。 この方法ですとダウンロードダイアログは表示されず直接クライアントのフォルダに コピーされますので、 System.Net.WebClientのDownloadFileメソッドでも実現できますね。 WebアプリなどでEXCELのダウンロードを行う場合、ダイアログで「開く」を選択すると 自動的にEXCELファイルが開いたので便利だったのですが。 とにかく疑問が解消され、とてもすっきりです。 ありがとうございました! | ||||||||
|
投稿日時: 2005-10-27 21:36
その前に、Web サービスってどんなもん、ってことを、勉強してみませんか?
基本的に、SOAP XML のやりとりをするので、それ以外のものは返せません。 Web アプリケーションと同じようにしたということは、 返信するストリームを全く乗っ取ってしまったと言うことです。 ということは、SOAP XML 中に乗っけてやればいいわけです。 と書いておいてたら、すでにレスが。。。
Windows アプリケーションの方で、SaveFileDialog を実装すればいいですよね? (っつうか、IEというアプリケーションがそういう作りになっている、と) 開く対象のファイルが安全かどうかも確認せずに開けることが便利かどうかわかりませんが(まぁ、自動検査していれば大丈夫だろうけど)、保存後にプロセスをキックしてやれば、ユーザからは“自動的に”Excel が起動しますよね? ___________________________________________________________________ □ written by Jitta on 2005/10/27 □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2004-Sept.2006 _________________ | ||||||||
|
投稿日時: 2005-10-28 12:05
Jittaさん、いつもありがとうございます。
はい、全く持ってその流れでいきたいと思います。 自分でキックいたします。 「Web サービスはSOAP XMLを返す。」基本でしたね。 今回もみなさま、色々ありがとうございました。 |
1