Kobarin's Development Blog

C#やASP.NETなどについての記録です。

Microsoft Chartコントロールで「ChartImg.axd の子の要求を実行中にエラーが発生しました」のエラーに対する対策

ASP.NETでMS Chartコントロールを使用して実行しようとした際、以下の様なエラーに遭遇する事があります。2種類まとめて書いてしまいます。

ChartImg.axd の子の要求を実行中にエラーが発生しました。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。
エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.Web.HttpException: ChartImg.axd の子の要求を実行中にエラーが発生しました。

要求の種類 'POST' の http ハンドラが見つかりませんでした。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。
エラーに関する詳細および例外の発生場所については、 スタック トレースを参照してください。
例外の詳細: System.Web.HttpException: 要求の種類 'POST' の http ハンドラが見つかりませんでした。

自分の場合、開発を進めていると突如このエラーに見舞われ、それまで正常に実行できていたページのChartまで同様のエラーで動かなくなりました。


冒頭のエラーメッセージでググると、幸い以下のサイトが発見でき、無事に解決できました。


みみたんのメモWiki - プログラミング/CSharp/ASP.NET/Microsoft Chart Controls - @ウィキモバイル


よくまとめられているため補足の必要はありませんが、自分のおこなった対策を簡単にまとめてみました。
基本的に、web.config内の記述がポイントになるようです。

  1. 内に以下の行を追加(または書き換え)。
  2. 内に以下の行を追加(または書き換え)。
  3. 内に以下の行を追加。

    (dirを実在するディレクトリを書きなおす)

自分の環境ではPostback実行後にChartを実行していたため、1と2で「GET,HEAD,POST」と書きなおす必要がありました。

Google Sitesで独自ドメインのサイトを表示するまで

大まかな流れ

  1. Google Sitesでサイト作成
  2. Google Appsコントロールパネル(以降コンパネ)でマッピング
  3. レジストラにホスト登録

手順

以降の手順は、独自ドメインを既に取ってあり、Google Appsのアカウント登録も済んでいる前提で書きます。

  1. 独自ドメインのAppsアカウントでログイン。
  2. Google Sitesへ移動し、サイトを作成します。適当に1ページだけ作ればいいです。
  3. サイトの設定から「共有と権限」を開き、「リンクを知っている全員が閲覧」を選択しておきます。作成途中なのでクローズにしたいのは山々ですが、これをしないとマッピングしてもリダイレクトされるだけになってしまうようです。
  4. Appsコンパネに移動し、グローバルメニュー「設定」へ進みます。
  5. 左メニューより「サイト」を選択。
  6. 「全般」タブを押し、「ユーザーはサイトを公開できます」にチェック。
  7. 「ウェブアドレスのマッピング」タブを押し、「新しいウェブアドレスを追加」を押します。
  8. Sitesで登録したアドレス(http://sites.google.com/a/xxxxx/の後の部分)を入力し、「web address」欄にサブドメインを入力し、画面下の「変更を保存」ボタンを押す。
  9. レジストラ(お名前ドットコム等)の設定画面に移動し、Appsで登録したサブドメインのCNAMEとして「ghs.google.com.」を登録します。Googleの説明上では現れませんが、末尾に「.」が必要です。これがないと、Sitesのアドレスにリダイレクトされるだけでホスト名で偽装できません。

以上。

経済センサスと事業所・企業統計調査の違い

H18まであった事業所・企業統計調査は、H21以降は「経済センサス」として移行されました。
その中で事業所や従業者数の数値が事業所統計と経済センサスで異なっていたため、調査方法の違いを調べたところ、内閣府のサイトに以下の資料が見つかりました。


経済センサス-基礎調査と事業所・企業統計調査の比較(内閣府)


調査対象の違いが大きく影響していると思われます。以下引用。

. 経済センサス 事業所・企業統計
調査の対象 約700万事業所
(調査員が現地確認により把握した事業所に加え、商業・法人登記簿に記載の法人も対象)
約570万事業所
(調査員が現地で確認したすべての事業所を対象)

ObjectDataSourceからクラスを呼び出してバインドする

Repeater等のデータリスト系コントロールから、データソースとしてObjectDataSource(以降ODS)を指定した際にクラスを呼び出す方法です。


私個人のやり方ですが、SQL文の定義を1つに集約するため、最近はSqlDataSourceやODSを個別に定義せず、クラスをObjectDataSourceから呼び出しています。
以下にサンプルを示します。
まずRepeaterのデータソースにODSを指定します。
ODSではFruitsクラスのItemsメソッドを呼び出し、パラメータに色タイプ(colorType)としてRedを指定しています。
Itemsメソッドでは、FruitクラスをGeneric化し返しています。

<asp:Repeater ID="rp1" runat="server" DataSource="ods1">
  <HeaderTemplate><ol></HeaderTemplate>
  <ItemTemplate>
    <li><%# Eval("Name") %>(<%# Eval("Price", "{0}円") %>)</li>
  </ItemTemplate>
  <FooterTemplate></ol></FooterTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ods1" runat="server" SelectMethod="Items" TypeName="Products.Fruits">
  <SelectParameters>
    <asp:Parameter DefaultValue="Red" Name="colorType" Type="String" />
  </SelectParameters>
</asp:ObjectDataSource>

クラス

namespace Products
{
  public class Fruits
  {
    public Fruits(){ }
    public List<Fruit> Items(string colorType)
    {
      List<Fruit> fruits = new List<Fruit>();
      switch(colorType)
      {
        case "Red":
          fruits.Add(new Fruit("Apple", 100);
          fruits.Add(new Fruit("Cherry", 250);
          break;
        case "Yellow":
          fruits.Add(new Fruit("Banana", 200);
          fruits.Add(new Fruit("Pineapple", 400);
          break;
        default: break;
      }
      return fruits;
    }
  }

  public class Fruit
  {
    public Fruit(string name, int price)
    {
      Name = name;
      Price = price;
    }
    public string Name{ get; set; }
    public int Price{ get; set; }
  }
}

実行結果

1. Apple(100円)
2. Cherry(250円)