2014年10月24日金曜日

Viewstate 検証に失敗しました。 原因: 指定された viewstate で整合性チェックに失敗しました。

ASP.NET Forms で顧客 db を開発・運用しています。
しかしたまに例の黄色いエラー画面が出ます。

そういう場合は、サーバーマシンのイベントビューアを確認します。 内容は↓参照

(2016/6/11追記)
どうも、machineKey という物が有り、定期的に自動生成されるみたいです。
これが viewstate 無効化の原因になるようです。
参考: ASP.NET と MachineKey の関係をまとめてみた

うちではこんな感じで Web.config に対策するようにしています:
 
<configuration>
 <system.web>
  <machineKey validationKey="0ED6BCBA637BA0EC06E3FACD3925B6087731147597AB33EF7A033FF047508878FA67819F24AE6C8624A71E16A26A22A72145C478C1527D35AE7A8685D8EB5E82"
              decryptionKey="A44271A23EE2CC673476A17222DE0D86AF104EBEFC3A97CA"
              validation="SHA1"/>
 </system.web>
</configuration>

ジェネレータはこのような感じです:

using System;
using System.Text;
using System.Security.Cryptography;

namespace Crypto {
    public class KeyCreator {
        public static void Main(String[] args) {
            String[] commandLineArgs = System.Environment.GetCommandLineArgs();
            if (commandLineArgs.Length < 3) {
                Console.Error.WriteLine("machineKeyGenerator 24 64");
                Environment.ExitCode = 1;
                return;
            }
            string decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1]));
            string validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2]));
            Console.WriteLine("<configuration>");
            Console.WriteLine(" <system.web>");
            Console.WriteLine("  <machineKey validationKey=\"{0}\"", validationKey);
            Console.WriteLine("              decryptionKey=\"{0}\"", decryptionKey);
            Console.WriteLine("              validation=\"SHA1\"/>");
            Console.WriteLine(" </system.web>");
            Console.WriteLine("</configuration>");

            Console.ReadLine();
        }
        static String CreateKey(int numBytes) {
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            byte[] buff = new byte[numBytes];
            rng.GetBytes(buff);
            return BytesToHexString(buff);
        }
        static String BytesToHexString(byte[] bytes) {
            StringBuilder hexString = new StringBuilder(64);
            for (int counter = 0; counter < bytes.Length; counter++) {
                hexString.Append(String.Format("{0:X2}", bytes[counter]));
            }
            return hexString.ToString();
        }
    }
}

GAE 上にジェネレーターを用意しました。精度が気にならないのであればこちらからでも。

ーーー
Event code: 4009
Event message: Viewstate 検証に失敗しました。 原因: 指定された viewstate で整合性チェックに失敗しました。
Event time: 2014/10/24 9:15:52
Event time (UTC): 2014/10/24 0:15:52
Event ID: 86a80a707a2d41b8be290a342d793e29
Event sequence: 98
Event occurrence: 1
Event detail code: 50203

Application information:
    Application domain: /LM/W3SVC/2/ROOT/hdb-3-130585818700385545
    Trust level: Full
    Application Virtual Path: 秘密
    Application Path: 秘密
    Machine name: DD7

Process information:
    Process ID: 6832
    Process name: w3wp.exe
    Account name: IIS APPPOOL\.NET v2.0

Request information:
    Request URL: 秘密
    Request path: 秘密
    User host address: 秘密
    User: 
    Is authenticated: False
    Authentication Type: 
    Thread account name: IIS APPPOOL\.NET v2.0

ViewStateException information:
    Exception message: 無効な viewstate です。
    Client IP: 秘密
    Port: 46470
    User-Agent: Mozilla/5.0 (Linux; U; Android 4.1.1; ja-jp; ME172V Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30
    PersistedState: 秘密
    Referer: 秘密
    Path: 秘密

Custom event details:
ーーー

2014年10月14日火曜日

メーラーのアドレス帳の引っ越しや相互運用について


Outlook 2003 → 外の世界へ
  • Microsoft Access
  • Microsoft Excel
  • テキストファイル
  • 個人用フォルダ ファイル (.pst)

Outlook 2003 ← 外の世界から
  • Microsoft Access
  • Microsoft Excel
  • Outlook Express 4.x, 5.x, 6.x
  • Schedule Plus Interchange (.sc2)
  • Schedule+ 7.0
  • テキストファイル
  • ロータス オーガナイザー 2000
  • 個人アドレス帳
  • 個人用フォルダ ファイル (.pst)
  • vCard ファイル (.vcf)

Windows Live Mail 2012 → 外の世界へ
  • カンマ区切り (.CSV)
  • 名刺 (.VCF)

Windows Live Mail 2012 ← 外の世界から
  • カンマ区切り (.CSV)
  • Windows アドレス帳 (.WAB)
  • 名刺 (.VCF)
  • 現在の Windows ユーザーのアドレス帳

Mozilla Thunderbird 24.3 → 外の世界へ
  • LDIF (*.ldi; *.ldif)
  • カンマ区切り (*.csv)
  • タブ区切り (*.tab; *.txt)

Mozilla Thunderbird 24.3 ← 外の世界から
  • Eudora
  • Outlook
  • Outlook Express
  • vCard ファイル (.vcf)
  • テキストファイル (LDIF, .tab, .csv, .txt)

Outlook Express 6 → 外の世界へ
  • アドレス帳 (WAB)
  • 名刺 (vCard)
  • Microsoft Exchange 個人アドレス帳
  • テキスト ファイル (CSV)

Outlook Express 6 ← 外の世界から
  • アドレス帳 (WAB)
  • 名刺 (vCard)
  • Microsoft Exchange 個人アドレス帳
  • テキスト ファイル (CSV)

ThunderbirdのLDIF形式について。参考情報:
http://dd-kaihatsu-room.blogspot.jp/2014/10/thunderbirdldif.html

CSV項目の対比[Outlook2003, Thunderbird24.3, Outlook Express 6, Windows Live Mail 2012]
https://drive.google.com/file/d/0Bygl-em20CSKeFA5Y3hvNlRuS2s/view?usp=sharing


2014年10月9日木曜日

レコード xxx を読むことができません。Excel SYLK

機械的に作出したSYLKファイルを読み込む際に、Excelがエラーを報告する場合が有ります。


「Microsoft Excel」
「レコード 373 を読むことができません。」
「引き続きエラーを表示しますか?」

Cygwin を使い、sylk をレコードごとに行に再分割する方法例:
cat /cygdrive/c/DL/output\ \(15\).slk | tr -d "\r\n" | sed -e "s/;;//g" | sed -e "s/;/\r\n/g" > AllRecord.txt

変換が必要な文字があります:

セミコロン → ";;"
タブ → "\x1B\x20\x39" 
改行 → "\x1B\x20\x3A"

---
エラーが出る例 その 1 【セミコロン編】
ID;DD
C;Y1;X1;K"ABC;DEF"
E

結果:
  • レコード 4 を読むことができません。レコード数は、行数目ではなく、セミコロン( ; )の出現回数で決まるようです。
  • セルの内容は「ABC」となっていて、「;DEF」の部分が無くなります。データが損失しているので、問題有りです。
---
修正した例
ID;DD
C;Y1;X1;K"ABC;;DEF"
E

結果:
  • エラーは表示されません。
  • セルの内容は「ABC;DEF」となっていて、期待していたデータが表示されました。

---
エラーが出る例 その 2 【タブ編】
ID;DD
C;Y1;X1;K"ABC DEF"
E

結果:
  • レコード 4 を読むことができません。レコード数は、行数目ではなく、セミコロン( ; )の出現回数で決まるようです。
  • タブが消えます。"\x1B\x20\x39" で対応できます。


2014年10月4日土曜日

ThunderbirdのLDIF属性について

メーラーのアドレス帳の移行方法を考えていました。

Thunderbirdに対して、ファイルかrあアドレス帳をインポートするには。。。
  • CSV形式
  • LDIF形式
アドレス帳にも条件が有りまして、
  • Outlook Expressでは、グループ(フォルダ)を利用しています。同報通信用です。これもそのまま移行したい。

LDIF形式が結構複雑な形式になっていて、条件を満たしそうな感じがいたしました。

LDIF_AddressBook.ods
https://drive.google.com/file/d/0Bygl-em20CSKNTlmV1RhRGVzQUE/view?usp=sharing

しかし目下、LDIF形式に変換する方法が無いのが課題です。。。