BlogEngine 1.6.1 で新機能として追加された reCaptcha を実装しました。
データのストアが DB で(XML ではなく)、かつ、reCaptcha の Logging を有効にしていると現れるバグがあって、解決に手間取��ましたので、そのあたりのことを備忘録として書いておきます。
匿名ユーザーがコメントを書き込もうとすると "Sorry, the following error occurred while processing your comment: コールバックでエラーが発生しました" というメッセージが出て書き込めないことでこの問題に気がつきました。
ググって調べてみると、CodePlex のサイトの Dicsussion のページで同じ問題の報告があって、バグがあることが分かりました。
問題は、以下の 2 つのファイルの中での LoadFromDataStore メソッドの戻り値の処置です。
- \admin\Pages\RecaptchaLogViewer.aspx.cs
- \App_Code\Extensions\Recaptcha\RecaptchaControl.cs
ストアが DB の場合は String 型、XML の場合は Stream 型として処置すべきところ、いずれも以下のように Stream 型として処置しているので、DB をストアに使用した場合にエラーとなります。
Stream s = (Stream)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog");
List<RecaptchaLogItem> log = new List<RecaptchaLogItem>();
if (s != null)
{
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.Serialization.XmlSerializer(typeof(List));
log = (List<RecaptchaLogItem>)serializer.Deserialize(s);
s.Close();
}
これを以下のように修正しました(CodePlex に出ていたコードと同じ内容です)。
string s = (string)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog");
List<RecaptchaLogItem> log = new List<RecaptchaLogItem>();
if (!String.IsNullOrEmpty(s))
{
using (StringReader reader = new StringReader(s))
{
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.Serialization.XmlSerializer(typeof(List<RecaptchaLogItem>));
log = (List<RecaptchaLogItem>)serializer.Deserialize(reader);
}
}
BlogEngine.Core の中にある LoadFromDataStore メソッドの方を修正する手もありそうですが、それは止めた方がよさそうです。何故なら、旧版 (1.5) では MemoryStream に変換して return するようにしているのに 1.6.1 で意図的に止めているところを見ると、何らかの理由がありそうなので。
あと、何故、認証されたユーザーなら書き込めるかも調べてみました。理由は、デフォルトの設定では、認証ユーザーの場合 reCaptcha の Logging がスキップされるので、問題のコードに処理が飛ばないためでした。
上記の修正後は CodePlex の Documentation に書いてあったとおりの手順で簡単にインストールでき、とりあえず今のところ問題なく動いています。
でも、ただでさえメールアドレスの入力が面倒なのに、これでさらに面倒になって誰もコメントしてくれなくなってしまうかもしれませんね。(汗)
追伸1
reCaptcha の Key の取得で、登録したドメインでのみ有効するのと、Global Key といってドメインに関係させない 2 つのオプションがあります。取得できる Key の数に制限はないので、自分は、本番用に前者を、開発用に後者を取得して使っています。
追伸2
コントロールパネルで Status の Enabled/Disabled の切り替えを行うと、web.config を書き換えに行くように見えます。これはファイルの中身を書き換えているのではなく、単に timestamp を変更するだけで、その理由はアプリケーションをリサイクルするためだそうです。(最初、これが原因かと思いましたがそうではなかったです。)