biz-Streamマニュアル Webサービスサーバ ガイド 第12章 サンプルプログラム(.NET) 12.7 CSV を生成しファイルシステムへ保存するサンプル(WCF)

12.7 CSV を生成しファイルシステムへ保存するサンプル(WCF)

概要

CSV を生成しファイルシステムへ保存するサンプルです。


環境準備

事前に『2.7 クライアントアプリケーションの環境構築』を確認してください。


サンプル構成

項目 ファイルパス
ページレイアウトサンプル <bswss-client_home>/sample/xml/Sample6.xml サンプル1
ソースサンプル <bswss-client_home>/sample/dotNET/wcf/WSS_WCF_Sample7.aspx.cs サンプル1

ソースサンプル

    using System;
    using System.IO;
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.Web;
    using BizStreamWebApplication.BizStreamServiceReference;

    namespace BizStreamWebApplication
    {
        public partial class WSS_WCF_Sample7 : System.Web.UI.Page
        {
            // Webサービスサーバのホスト名
            const string WSS_HOST_NAME = "wsssrv";

            // Webサービスサーバ上のサンプルディレクトリの場所
            const string WSS_BIZSTREAM_SAMPLE_DIR = "\\bs\\sample";

            // Webサービスのエンドポイントプリフィックス
            const string WSS_SERVICE_LOCATION = "http://" + WSS_HOST_NAME + ":8080/axis2/services";

            // BASIC認証のユーザ名
            const string USER_NAME = @"bizuser1";

            // BASIC認証のパスワード
            const string PASSWORD = @"bizuser1";

            // 監査ロギング用のユーザ定義
            const string USER_DEF = "AAA";

            // 入力レイアウト定義ファイル名
            const string LAYOUT_FILE = WSS_BIZSTREAM_SAMPLE_DIR + "\\xml\\Sample6.xml";

            // 出力先ファイルパス
            const string OUTPUT_FILE = @"C:\\Temp\\WSS_WCF_Sample7.csv";


            protected void Page_Load(object sender, EventArgs e)
            {
                // データの生成
                byte[] data = generate();

                // バイト配列をファイルにすべて書き込む
                File.WriteAllBytes(OUTPUT_FILE, data);

                // ブラウザに結果を表示
                Response.Clear();
                Response.ContentType = "text/html;charset=UTF-8";
                Response.Write("<HTML><HEAD><TITLE>WSS_WCF_Sample7</TITLE></HEAD><BODY>");
                Response.Write("正常終了しました。<BR>");
                Response.Write("ファイルパス:" + OUTPUT_FILE);
                Response.Write("</BODY></HTML>");
                Response.Flush();
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }

            private byte[] generate()
            {
                // クライアントを生成
                bizstreamPortTypeClient client =
                    new bizstreamPortTypeClient("BizstreamSOAP11port",
                        WSS_SERVICE_LOCATION + "/bizstream?UserDef=" + USER_DEF);

                // 認証の設定
                BindingElementCollection elements = client.Endpoint.Binding.CreateBindingElements();
                elements.Find<HttpTransportBindingElement>().AuthenticationScheme =
                    System.Net.AuthenticationSchemes.Basic;
                client.ClientCredentials.UserName.UserName = USER_NAME;
                client.ClientCredentials.UserName.Password = PASSWORD;

                // MTOMを有効化
                elements.Remove<TextMessageEncodingBindingElement>();
                MtomMessageEncodingBindingElement mtom = new MtomMessageEncodingBindingElement();
                mtom.ReaderQuotas.MaxStringContentLength = 100000;
                elements.Insert(0, mtom);
                elements.Find<HttpTransportBindingElement>().KeepAliveEnabled = false;
                client.Endpoint.Binding = new CustomBinding(elements);

                // リクエストメッセージの作成
                generateDataRequest request = new generateDataRequest();

                // 出力ファイルの種類を設定
                request.dataType = new dataType();
                request.dataType.Item = new csv();

                // レイアウト定義を設定
                request.layoutData = new layoutDefinition[1];
                request.layoutData[0] = new layoutDefinition();
                request.layoutData[0].uri = LAYOUT_FILE;

                // リクエストを送信
                fileData data = client.generateData(request);

                /*
                 * CSV出力はFileData#getContentDataGroup()よりBase64Binaryの配列を取得する
                 * (CSVの1行が1配列要素となっている)
                 * また、出力エンコーディングはUTF-8となるので注意
                 */
                // データサイズの計算
                base64Binary[] list = data.contentDataGroup.contentData;
                int size = 0;
                for (int i = 0; i < list.Length; i++)
                {
                    base64Binary base64 = list[i];
                    byte[] lineData = base64.Value;
                    size += lineData.Length;
                }

                // CSVデータの連結
                MemoryStream stream = new MemoryStream();
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    for (int i = 0; i < list.Length; i++)
                    {
                        base64Binary base64 = list[i];
                        byte[] lineData = base64.Value;
                        writer.Write(lineData);
                    }
                }
                return stream.ToArray();
            }
        }
    }