【ASP.NET】「web サーバーでデバッグを開始できません。」というエラーが出た時は

先日、急にPCがおかしくなり、Visual Studio 2005やIISの構成を再構築した。
その時、Visal StudioとIISを使ってWEBアプリケーションをデバッグしようとしたら、以下のメッセージが出てはまったので、備忘録としてメモ。

web サーバーでデバッグを開始できません。 web サーバーは正しく構成されていません。

このメッセージが出たときは、IISのアプリケーションの構成を確認して、動かしたい拡張子がちゃんと定義されているか確認する。

IISのアプリケーションの構成
IISのアプリケーションの構成

ちゃんと定義されていても、ASP.NETをインストールする順序が違ったりすると構成の関連付けが上手くいっていないこともあるので、以下のコマンドを実行して、再度ASP.NETを再インストールする。
(「ファイル名を指定して実行」に1行ずつコピーして実行)

C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -u
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

※aspnet_regiis.exeまでのパスはそれぞれの環境で違うのでそれぞれでしてする。

上の1行目のコマンドでASP.NETの関連付けをアンインストールして、再度、2行目のコマンドで再インストールするという流れ。
それぞれのコマンドは数分ほどかかるので、それぞれ終わるまで確認する。
これで大体のエラーはOKだと思います。

基礎からのASP.NET SE必修! (SE必修!プログラマの種シリーズ)

著者/訳者:目時 秀典 鈴木 和久

出版社:ソフトバンク クリエイティブ( 2007-03-27 )

定価:

大型本 ( 560 ページ )

ISBN-10 : 4797338229

ISBN-13 : 9784797338225


【ASP.NET】C# DataTable.Select()メソッドにはやはりバグがある!?

久しぶりに技術的な記事でも。
MSDNのフォーラムで非常に興味深い投稿があったので自分でも色々試してみた。

僕自身もDataTable.Select()メソッドはなんか変だなぁと違和感をずっと感じていた。
前もブログの記事にしたけど、

やっぱりDataTable.Select()メソッドには何かしらのバグがあるとしか思えない。

まず下のソースコードだが、フォーラムの投稿を僕の普段の環境Visual Studio 2005、.NET Framework 2.0という条件に書き直して実行してみた。

    DataTable dt = new DataTable();

    dt.Columns.Add("Column1", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column2", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column3", typeof(string)).AllowDBNull = false;

    // DataTable.Load などでは内部的に実行される
    dt.BeginLoadData();
    dt.EndLoadData();

    // (回避その1 → 削除しない)
    dt.Columns.Remove("Column1");

    // (回避その2 → テーブルを作り直す)
    //dt = dt.Copy();

    Random r = new Random();
    for (int i = 0; i < 1000; i++)
    {
        DataRow row = dt.NewRow();
        row["Column2"] = "";
        row["Column3"] = new string((char)r.Next('A', 'Z' + 1), 1);
        dt.Rows.Add(row);
    }

    // DataView による絞り込み
            DataView dv = new DataView(dt,"Column3 = 'C'",string.Empty,DataViewRowState.CurrentRows);
    int rowCount1 = dv.Count;
    // Select による絞り込み
    int rowCount2 = dt.Select("Column3 = 'C'").Length;
    // (回避その3 → 条件内で関数を使う)
    int rowCount3 = dt.Select("convert(Column3, 'System.String') = 'C'").Length;

    MessageBox.Show(
        string.Format(
            "1. DataView.RowFilter → {0}\r\n" +
            "2. DataTable.Select → {1}\r\n" +
            "3. DataTable.Select(2) → {2}",
            rowCount1, rowCount2, rowCount3));

MSDNの投稿にもあるように、DataTableからカラムを削除すると、DataViewにキャストしたときの件数、DataTable.Select()で取得した件数、DataTable.Select()メソッド内で関数を使った場合の件数それぞれが一致しなかった。
やはり、DataTable.Select()メソッドにはバグがあるように思えてしかたない。
普段、よく使うメソッドだけに、慎重に使用しないといけないと思い直した。

Microsoftさん。気づいていたら早急に対応して頂きたいものです。
それとも何か理由があるのだろうか??
また分かり次第、記事にしてみようと思う。

【ASP.NET】DataSet.ReadXml()のパフォーマンス向上(巨大xmlファイルの読込高速化)

ADO.NETでxmlファイルを読み込み、DataSetに格納するには、DataSet.ReadXml()を使用すると便利だが、xmlファイルが巨大化すると、時としてかなりのパフォーマンス低下が生じる。
なんかいい方法はないかといろいろ調べていたら、msdnにまさにドンぴしゃりの記事を見つけたのでメモ。

[msdn]XML からの DataSet の読み込み

非常に大きなファイルを読み込む際に ReadXml を呼び出すと、パフォーマンスが低下することがあります。大きなファイルを読み込む場合に、ReadXml のパフォーマンスを最大にするには、DataSet のテーブルごとに BeginLoadData メソッドを呼び出し、その後で ReadXml を呼び出します。最後に、次の例に示すように、DataSet のテーブルごとに EndLoadData を呼び出します。

以下の様に、DataSet.ReadXmlの前後で、BeginLoadDataメソッドとEndLoadDataメソッドを使用して処理する。

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.BeginLoadData();

dataSet.ReadXml("file.xml"); 

foreach (DataTable dataTable in dataSet.Tables)
   dataTable.EndLoadData();

これでかなり大きなxmlファイルを使用するのでもものすごくパフォーマンスが向上し、読込速度が数段上がった。
BeginLoadData メソッド、EndLoadData メソッドは以下のような関数である。

DataTable.BeginLoadData メソッド
データを読み込む間、通知、インデックスの維持、および制約をオフにします。

DataTable.EndLoadData メソッド
データを読み込んだ後、通知、インデックスの維持、および制約をオンにします。

【ASP.NET】C# Basic認証のあるxmlファイルのダウンロード(Twitter API)

Twitter APIのようにBasic認証のあるxmlファイルのダウンロードする方法。
これまたよく忘れそうなのでメモ。

//Followしてる人のタイムラインを返すtwitter APIへのパス
string twitPath = "http://twitter.com/statuses/friends_timeline.xml";

//Basic認証情報をインスタンス化
System.Net.NetworkCredential nc = new System.Net.NetworkCredential("ユーザー名","パスワード");
System.Net.WebClient wc = new System.Net.WebClient();

//Basic認証情報のセット
wc.Credentials = nc;

//TwitterAPIからXMLファイルをダウンロード
wc.DownloadFile(twitPath, @"download.xml");
wc.Dispose();

【ASP.NET】C# webからファイル(html,txt,画像jpg,gif等)を取得(ダウンロード)する方法

よく使う処理だが、たまに忘れるなのでメモしておく。

ASP.NET C#を使って webからhtmlファイルのソースやtxtファイルの中身を取得する方法。

//WEBからファイル取得
System.Net.WebClient wc = new System.Net.WebClient();
byte[] pageData = wc.DownloadData("対象のURL");
wc.Dispose();

//UTF8にエンコードして文字列(ソース)を取得
string text = Encoding.UTF8.GetString(pageData);

次に画像ファイル(jpg,gif,png)やその他のファイルを、ローカルにダウンロードして保存する方法

//WEBからファイル取得
System.Net.WebClient wc = new System.Net.WebClient();
wc.DownloadFile("対象のURL",@"保存するローカルパス");
wc.Dispose();

【ASP.NET】VB.NETをC# C#をVB.NETにコード変換してくれるコードコンバーター

また便利なサイトを見つけたのでメモ。
僕自身はC#を使ってコーディングしている訳だが、ASP.NETの技術記事を検索すると、たまにVB.NETで記述されている記事を見かける。
なんとなく漠然とは理解できるが、C#で書いてくれてたらなぁ~と思うことがしばしば。
VB.NETをC#に変換してくれるサイトとかないのかなぁ~と思ってたら見つけたのでメモ。

Convert VB.NET to C#

逆にC#からVB.NETへの変換も出来る。
タブがあるのでそちらで切り替えてもOK.
Convert C# to VB.NET

【ASP.NET】Ajax非同期ポストバックの画像やメッセージの表示方法

ASP.NETでAjaxの非同期ポストバックの時の画像やメッセージを表示するためには、まず、ScriptManagerコントロールとUpdatePanelを配置する。
そして、メッセージや画像を表示するためのLabelを配置する。
そして以下のJavaScriptを読み込ませるだけで完成。

function pageLoad(){
    var mng = Sys.WebForms.PageRequestManager.getInstance();

    mng.add_initializeRequest(
        function(sender, args)
        {
            $get('LabelStatus').innerHTML = "
処理中です。。。"; } ); mng.add_endRequest( function(sender, args) { $get('LabelStatus').innerHTML = ""; } ); }

【ASP.NET】DataTableのSelectメソッドはパフォーマンスが悪い!

DataTableのSelectメソッドを多数使った処理のファイルを作成したが、処理時間がとても長くなったため、いろいろと調べてみた。
msdnにまさにぴったりの記事を見つけたので忘れないようにメモ。

テーブル内のデータの表示

DataTable の Select メソッドへの呼び出しを多数実行する場合は、最初に DataTable の DataView を作成することにより、パフォーマンスを向上させることができます。DataView を作成すると、テーブルの行にインデックスが付けられます。Select メソッドがこのインデックスを使用すると、クエリ結果を生成するための時間が大幅に減少します。

実際にDataTableからDataViewを作成して試してみたら、処理時間が短縮した。
ただし、値を取得するにはDataViewはちょっとめんどくさい。
DataTableのSelectメソッドってもしかして。。。全部回してデータを振り分けてるのかな??

【ASP.NET】C#冗長なViewStateをすっきりとSessionで管理する方法

ASP.NETでは、自動で、ページの状態を保持するViewStateがhtmlタグの
<input type=”hedden”>によって吐き出される。
ポストバックが起きて画面が変わっても、状態を保持しているため、細かい設定などしなくても入力値などが保持される。
しかし、GridView等で一覧を作った時など、このViewStateがかなりの長さになって出力に時間がかかったりすることがある。
実際に、仕様上どうしても数百件のデータをページング無しでGridView出力しないといけない画面があり、この画面のViewStateは数千行になった経験がある。
このViewStateをクライアントサイドに出力するのではなく、なんとかサーバーサイドに(Sessionとして)保持出来ないか、調べてみたところ、ASP.NET2.0ではViewStateを保持するSessionPageStatePersisterクラスというのがあるとのこと。
早速テストして試してみた。

まず新規のクラスファイル(SessionPageStateAdapter.cs)を作成し、以下のコードを記述。
これをApp_Codeフォルダに保存。

public class SessionPageStateAdapter :
    System.Web.UI.Adapters.PageAdapter
{
    public override PageStatePersister GetStatePersister ()
    {
        return new SessionPageStatePersister(this.Page);
    }
}

次に「ASP.NETフォルダの追加」で「App_Browsers」フォルダを作成。
そのフォルダの中に「App.browser」ファイル(ファイル名はなんでもいい)を作成し、以下のコードを記述。
この「browser」ファイルだが、各ブラウザごとにいろいろと設定を記述することが出来るファイルらしい。(初めて使用した)


  
    
      
    
  

以上の操作だけで、全画面のViewStateの出力がすっきりとし、パフォーマンス的にはいいんじゃないだろうか?
まぁ、まだテスト段階の使用なので問題などあれば追記していこうと思う。
このSessionPageStatePersisterクラス、将来的にはデフォルト使用されるようになる気がする。

参考サイト
ビュー ステート: 沈黙のパフォーマンス キラー
[.NET] ViewStateをセッションに保存する

【ASP.NET】C#DataTableの中身をdistinct(グルーピング)する方法

DataTableで重複データがあるときに重複を除去するため、distinctというか、グルーピングする方法は以下のようにする。

DataTable dtUnique = dtMyTable.DefaultView.ToTable(true, "Column1", "Column2");

これで、”Column1″, “Column2″ でグルーピングしたデータテーブルが帰ってくる。

プログラミングC#―C#2.0/.NET2.0/Visual Studio2005対応

著者/訳者:ジェシー リバティ

出版社:オライリージャパン( 2006-02 )

定価:¥ 5,040

単行本 ( 645 ページ )

ISBN-10 : 4873112648

ISBN-13 : 9784873112640