リード開発メモ

大阪のソフトウェア会社です。 技術的な事柄についてのメモとしてブログを始めます。

ASP.NET

LINQ to SQL で実行される SQL を出力ウィンドウに表示する

LINQ to SQL で実行される SQL を出力ウィンドウに表示する方法。

まず、次のようなクラスを定義する。
class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

そして System.Data.Linq.DataContext の Log プロパティにセットしてやればいいようだ。
db.Log = new DebugTextWriter();

また、ファイルに書き出す場合は以下のようにする。
   db.Log = new System.IO.StreamWriter("sql.log") { AutoFlush = true };

以上です。

ASP.NET Response.Redirect で例外が発生する

ASP.NET で Response.Redirect を呼ぶと ThreadAbortException 例外が発生する。エラーメッセージは「式を評価できません。」であり、これでは何が悪いのかわからない。

どうも tyr-catch で囲んでいる場合に限って例外が発生する模様。

調べたところ、以下の情報があった。
http://support.microsoft.com/default.aspx?scid=kb;ja;312629

Response.Redirect の仕様らしい。
Response.Redirect の2引数のオーバーロードを使って、ふたつめの引数に false を指定せよ、とのこと。

ASP.NET JavaScript のデバッグ

ASP.NET の開発中にクライアントサイド JavaScript のデバッグをしたくなることがある。

そのときは、準備として Internet Explorer の[ツール]メニュー - [インターネットオプション] を選び、
[詳細設定]タブ - [ブラウズ]にある
・スクリプトのデバッグを使用しない(Internet Explorer)
・スクリプトのデバッグを使用しない(Other)
のチェックを外しておく。

また、JavaScript のデバッグしたい箇所の直前に
debugger;
と記述し、デバッグしたい箇所にブレークポイントを仕掛けておく。

あとは、普通に F5 などで実行するだけ。

ASP.NET で SerializationException エラー

ASP.NET で jqGrid を使っているのだが、AJAX で明細データを取得する箇所で、ある環境で動かないとの報告を受けた。自分の開発環境ではちゃんと動くし、デプロイしたものでも問題なし。

その後、以下のようなエラーが出ているとの連絡が。。。
System.Runtime.Serialization.SerializationException

アセンブリ 'XXX, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null' の型 'XX.XXX.XXXX.XXXModel' はシリアル化可能として
設定されていません。

結局、XXXModel に Serialization 属性を付加するとちゃんと動いた模様。

なぜ、特定の環境でだけ動かないのだろう?
この件と関係があるのだろうか。。。

ASP.NET フォームキーの最大数の制限

過去に作成した ASP.NET のサイトで「更新ボタンを押したらエラーになる」との報告がきた。
スタックトレースは以下のようなもの。


'XXXX' アプリケーションでサーバー エラーが発生しました。
オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および
例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は
有効ではありません。
ソース エラー:
現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する
情報については、下の例外スタック トレースを使って確認できます。
スタック トレース:
[InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。]
   System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding) +11373279
   System.Web.HttpRequest.FillInFormCollection() +329

[HttpException (0x80004005): URL にエンコードされたフォーム データが有効ではありません。]
   System.Web.HttpRequest.FillInFormCollection() +11487362
   System.Web.HttpRequest.get_Form() +157
   Microsoft.Web.Infrastructure.DynamicValidationHelper.<>c__DisplayClass12.b__e() +63
   Microsoft.Web.Infrastructure.DynamicValidationHelper.<>c__DisplayClass12.b__11() +20
   Microsoft.Web.Infrastructure.DynamicValidationHelper.DeferredCountArrayList.get_Count() +20
   System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +34
   System.Web.HttpRequest.get_Form() +212
   System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request) +160
   System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +55
   System.Linq.Enumerable.All(IEnumerable`1 source, Func`2 predicate) +149
   System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos) +428
   System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +140
   System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, 
ControllerDescriptor controllerDescriptor, String actionName) +27
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +148
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
   System.Web.Mvc.<>c__DisplayClassb.b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.b__0() +20
   System.Web.Mvc.<>c__DisplayClasse.b__d() +54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375

確かに最近変更は行ったがまったく関係のない箇所だったので、調べてみたら Microsoft セキュリティ更新プログラム MS11-100 による影響だった模様。
下記のページの解決方法に従って、Web.config に設定を追加して解決。
http://support.microsoft.com/kb/2661403/ja


<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2000" />
</appSettings>
</configuration>

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

livedoor 天気