‘.Net Framework’ カテゴリーのアーカイブ

ASP.Net MVCでページキャッシュを行い、DB更新時にキャッシュを破棄するには。

2010年2月10日 水曜日

データベースキャッシング機能を有効にする。データベース名が「TestDB 」、キャッシュ機能を有効にしたいテーブル名が「Table1 」である場合、Visual Studio 2008コマンドプロンプトで下記を実行する。

aspnet_regsql.exe -S .\SQLEXPRESS -E -d TestDB -ed
aspnet_regsql.exe -S .\SQLEXPRESS -E -d TestDB -t Table1 -et 

Web.configの<system.web>内に下記を設定する。DBへの接続文字列が「TestDBConn」の場合。varyByParam=”*”を指定することで、パラメータごとにCacheが作られるようになる。sqlDependencyを指定することで、指定したDBのテーブルが更新されるとキャッシュが破棄される。

<caching>
      <sqlCacheDependency enabled=”true” pollTime=”5000″>
        <databases>
          <add name=”TestDB” connectionStringName=”TestDBConn” />
        </databases>
      </sqlCacheDependency>
 <outputCacheSettings>
    <outputCacheProfiles>
     <add name=”TestCache” enabled=”true” duration=”3600″ varyByParam=”*” sqlDependency=”TestDB :Table1″ />
    </outputCacheProfiles>
   </outputCacheSettings>
    </caching>

 Asp.Net MVCのControllerクラスのメソッドでOutputCache属性を使ってキャッシュプロファイルを設定する。

    [HandleError]
    public class TestController : Controller
   {
        [OutputCache(CacheProfile = "TestCache")]
        public ActionResult Index(string id)
        {
        }

ASP.Net MVCでSite.master(マスタページ)をそのまま使うとIE6が後方互換モードになってしまう。

2009年12月20日 日曜日

標準のテンプレートだと1行目に空白が入ってしまうため、IE6が後方互換モードになってしまう。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
 ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>

の行を1行目に持ってくればOK。

Windows Server 2008 R2/Windows 7でASP.NetからSQL Serverに接続するユーザが変更された

2009年12月11日 金曜日

以前は「Network Service」で接続したが、アプリケーションプール名が「DefaultAppPool」の場合、「IIS AppPool\DefaultAppPool」で接続できる。

ユーザ、グループの検索画面には検索しても出てこないので、直接入力する。

ADO.Net Entity Frameworkでストアドプロシジャを実行するには

2009年12月9日 水曜日
  1. Visual Studioエンティティデザイナでコンテキストメニューを開いて、「データベースモデルからモデルを更新」を実行し、実行したいストアドプロシジャを追加する。
  2. モデルブラウザから「EntityContainer->関数インポート」上でコンテキストメニューを開いて、「関数インポートの作成」実行する。
  3. 「関数インポートの追加」ウィンドウが表示されるので、ストアドプロシジャ名を選択し、関数インポート名、戻り値の型を設定する。
  4. 関数インポートが追加される。
  5. Entity Clientを利用して、インポートした関数を実行する。

 using (EntityConnection conn =
    new EntityConnection(“name=AdventureWorksEntities”))
{
    conn.Open();
    try
    {
        // Create an EntityCommand.
        using (EntityCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = “AdventureWorksEntities.GetOrderDetails”;
            cmd.CommandType = CommandType.StoredProcedure;
            EntityParameter param = new EntityParameter();
            param.Value = “43659″;
            param.ParameterName = “SalesOrderHeaderId”;
            cmd.Parameters.Add(param);

            // Execute the command.
            using (EntityDataReader rdr =
                cmd.ExecuteReader(CommandBehavior.SequentialAccess))
            {
                // Read the results returned by the stored procedure.
                while (rdr.Read())
                {
                    Console.WriteLine(“Header#: {0} “ +
                    “Order#: {1} ProductID: {2} Quantity: {3} Price: {4}”,
                    rdr[0], rdr[1], rdr[2], rdr[3], rdr[4]);
                }
            }
        }
    }
    catch (EntityException ex)
    {
        Console.WriteLine(ex.ToString());
    }
    conn.Close();
}

.Net frameworkのSyndicationFeedクラスを使ってYahoo Media RSS(MRSS)などの拡張フィードを取得するには

2009年11月27日 金曜日

SyndicationFeedに含まれるSyndicationItemのElementExtensionsプロパティを使って取得可能。

たとえば下記のように、サムネールを取得することが可能である。

        private static readonly XNamespace NS_YAHOO_MEDIA_RSS = “http://search.yahoo.com/mrss/“;

        public static string GetThubmnailUri(SyndicationItem item)
        {
            var extensions = item.ElementExtensions.Where<SyndicationElementExtension>(
               obj => obj.OuterNamespace == NS_YAHOO_MEDIA_RSS).ToArray();
            XmlReader reader = extensions[0].GetReader();
            XElement topElem = (XElement)XElement.ReadFrom(reader);
            XElement thumbElem = topElem.Elements(NS_YAHOO_MEDIA_RSS + “thumbnail”).FirstOrDefault();
            if (thumbElem != null)
            {
                XAttribute attr = thumbElem.Attribute(“url”);
                if (attr != null)
                {
                    return attr.Value;
                }
            }
            return string.Empty;
        }

.Net(C#)でRSS, Atomなどのフィードを取得/作成するには

2009年11月27日 金曜日

System.ServiceModel.Syndication.SyndicationFeedクラスを使用する。System.ServiceModel.Web.dll クラスを参照することが必要となる。フィードの取得は下記のように行う。

using (XmlReader reader = XmlReader.Create(“フィードのURI”))
            {
                SyndicationFeed feed = SyndicationFeed.Load(reader);
                SyndicationItem[] itemList = feed.Items.ToArray();
            }

これでitemListにフィードのエントリを格納したSyndicationItemの配列が返される。

フィードの作成にはSyndicationFeed クラスを利用してフィードを作成し、Atom10FeedFormatterクラス を利用してシリアライズするとAtom形式になり、Rss20FeedFormatter クラスを利用してシリアライズするとRSS2.0形式になる。

ASP.Net MVCをIIS 6.0で動かすと「404エラー」になるのを回避するには

2009年11月14日 土曜日
  1. 拡張子「.mvc」をASP.Netにマップする設定をIISのアプリケーションマップに追加するために、スクリプト「C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 1.0\Scripts\registermvc.wsf」を実行する。 ASP.Net MVC 2の場合はregistermvc.wsfがないので、下記のように手動で登録する。
    Webサイトのプロパティ->ホームディレクトリ->構成からアプリケーションの構成を開き、追加ボタンで「アプリケーションの拡張しマッピングの追加/編集を開く。
    実行可能ファイル:c:\windows\microsoft.net\framework\v4.0.30319\aspnet_isapi.dll
    拡張子:.mvc
    動詞:制限 GET,HEAD,POST
    スクリプトエンジン:チェック
    ファイルの存在を確認する:チェックなし
    に設定し、「OK」ボタンをクリックする。
  2. アプリケーションの「Global.aspx」のMapRouteを変更して、「.mvc」の拡張子をコントローラ名に追加して、「{controller}.mvc/{action}/{id}」のようにする。また、あらたにRootに対するマップを追加して、ルートUrlのアクセスを/Home/Indexにマップする。変更後のコードは下記。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{

public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
                "Default",
                "{controller}.mvc/{action}/{id}",
                new { action = "Index", id = "" }
              );

routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );

}

protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}