by WebSurfer
19. May 2010 22:24
先の投稿 日本語の文字化けの問題(1) で書きました [WebResource.axdを圧縮] にチェックを入れると日本語が文字化けする問題に対応しました。
原因は、BlogEngine.Core の Web\HttpModules フォルダの中にある HTTP モジュール CompressionModule.cs で、Encoding.Default でバイト列を文字列に変換し、文字列を処理した後、
再び Encoding.Default で文字列をバイト列に戻しているところでした。
MSDN ライブラリによると、Encoding.Default は "オペレーティング システムの現在の ANSI コード ページのエンコーディングを取得します" とのことで、
サーバーの OS のデフォルトの Encoding になるようです。自分が使っているホスティングサービス会社のサーバーは日本にあるので、Encoding.Default は Shift_JIS になるようです。
一方、実際の Encoding は UTF-8 であるため、Encoding.Default での変換で情報が失われて文字化けしてしまうようです。
web.config の globalization 要素の requestEncoding, responseEncoding を Shift_JIS にすると文字化けがなくなるという話を Web で見ますが、そういう理由のようです。
正しい解決方法は、CompressionModule.cs で使われている Encoding.Default を実際に使用されている Encoding にすることだと思われます。
WebResourceFilter クラスの Write メソッドの中に 2 ヶ所問題の部分がありますが、それを以下のように変更してみました。
public override void Write(byte[] buffer, int offset, int count)
{
//string html = System.Text.Encoding.Default.GetString(buffer);
string html = HttpContext.Current.Response.ContentEncoding.GetString(buffer);
・・・中略・・・
//byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
byte[] outdata = HttpContext.Current.Response.ContentEncoding.GetBytes(html);
_sink.Write(outdata, 0, outdata.GetLength(0));
}
とりあえず、上の写真のように [WebResource.axdを圧縮] にチェックを入れても文字化けはしなくなりました。このまましばらく様子を見たいと思います。
by WebSurfer
9. May 2010 17:30
このホームページのサーバーは Windows Server 2008 の IIS7 で、アプリケーションプールのマネージパイプラインモードは Integrated mode がデフォルトになっています。
一方、CodePlex のサイトにある Documentation によると、IIS7 を使用する場合、BlogEngine を運用するアプリケーションプールは "Classic .NET AppPool" にしないと、"some of the software will fail in strange ways" と書いてありました。
BlogEngine はホームページ本体とは別アプリケーションなので、自分でサーバーを運用していれば、それのみ "Classic .NET AppPool" にするのは簡単ですが、レンタルサーバーではどうしようもありません(念のため、できないか聞いてみましたが、ダメとのこと)。
Microsoft の MSDN ライブラリの ASP.NET と IIS 7 の統合 などを読んで、対応方法を検討してみました。
それを見ると、問題は web.config における HttpModule と HttpHandler の定義方法のようです。要するに、<system.web> セクションの <httpModules> と <httpHandlers> 内に定義してはダメで、すべて <system.webServer> セクションの <modules> と <handlers> 内に移す必要があるということのようです。
実際に、<system.web> セクションの <httpModules> と <httpHandlers> 内のみに HttpModule と HttpHandler を定義すると、上の写真のようなエラーになります。
対処方法としては、MSDN ライブラリや写真のエラーメッセージに書いてあるように、appcmd.exe migrate config コマンドを実行するのがよさそうですが、レンタルサーバーではどうしようもありません。
仕方がないので、自分の PC でコマンドを走らせて web.config がどのように修正されるか調べ、それに従って手動でサーバーにある web.config を書き換えることにしました。
で、結論から言うと、BlogEngine.NET 1.6.1 の場合、web.config はすでにコマンドを走らせたのと同様な形に対応済みで、修正の必要はなかったです。
というわけで、BlogEngine.NET 1.6.1 は web.config の修正なしで IIS7 Integrated mode で動くということと理解しました。(これだけの対応で本当に済むのかどうかはまだちょっと疑問ですが・・・(汗))
ちなみに、appcmd.exe を走らせると web.config がどのように変わるかというと、<system.webServer> およびその中に <modules> と <handlers> が追加され、<system.web> セクションで定義されている HttpModule と HttpHandler がコピーされます。また、<validation validateIntegratedModeConfiguration="false" /> も追加されます。
要するに、Visual Studio 2008 がデフォルトで作る web.config と同じような内容になるということです。苦労して調べたのに、なんのこっちゃ・・・という感じです。(笑)
by WebSurfer
8. May 2010 15:56
ブログの見栄えの改善のため、以下の処置を行いました。備忘録として書いておきます。一番目から三番目は BlogEngine.NET 1.6.1 の設計に関わるもので、他の方にも起こる問題です。その他は、自分が CSS を変更したことに伴う不具合の修正です。
- 「検索」で、タイトルの表示が「の検索結果 'hoge'」(英文向け)となる ==> search.aspx.cs で Thread.CurrentThread.CurrentUICulture によって CultureInfo を取得し、その Name プロパティが "ja-JP" または "ja" の場合はテレコにするよう処置を分けた("ja" は Firefox 対策です)。
- 「検索」で、検索結果の URL 情報が一行に収まらない ==> search.aspx の中のその部分のコード <span class="url"><%# ShortenUrl((String)Eval("RelativeLink")) %></span> ���行をコメントアウトして表示されないようにした。本質的な解決になっていませんが、空白やハイフンが入らない長い英数字を途中で改行する対処方法がどうしても見つかりません。
- 「関連するブログ」で、テキストの折り返しがされない ==> style.css で #relatedPosts span の display: inline-block を削除。何故か IE8 では互換表示でないと折り返されません。IE6, Firefox, Opera, Safari では問題なく折り返されます。削除すると思わぬところで副作用があるかもしれませんが、この見栄えの悪さは我慢できないレベルなので削除しました。
- 「コメントを書く」で、E-mail の行が一行に収まらない ==> style.css で .commentForm input の width を 300px から 190px に変更。
- 「検索」で、TextBox の行が一行に収まらない ==> CheckBox の直前に <br /> を追加して改行した。
- Widget 内の検索用の TextBox と Button が一行に収まらない ==> style.css で #searchbox #searchfield の width を 180px から 110px に変更。
-------- 2010/6/8 追記 --------
2 番目の問題は Slug の使用 で解決できましたので、コメントアウトしたコードを元に戻して復活させました。