くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2016年07月

C# .net MVCでCSSのキャッシュを変えさせるクエリ文字列を自動でつける

タイトル通り。CSSとか更新した際に、普通はクライアントでF5しないと読み込み直さない。それを無理矢理やらせるのに、「site.css」みたいなのに「site.css?20160508113250」みたいなクエリ文字列をつけると別ファイルと認識して読み込み直させるというやつがある。↓の感じ。

<link href="/Content/site.css" rel="stylesheet"/>
↑を↓にする
<link href="/Content/site.css?20160508113250" rel="stylesheet"/>

.netMVCだと、CSSとかJavaScriptとかはcshtml側で、「@Styles.Render("~/Content/css")」みたいに書くけど、これの結果を↑の日付のクエリ文字列をつけた形に自動で変えたい。日付はファイルの更新日で。

で、これをやるのに、何がいいかなーで探したら一番よさそうなのは下の感じ。

修正するのは「BundleConfig」。こいつを下の感じに変える。

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        //とりあえず追加したいBundle作る
        var addBundle = new StyleBundle("~/Content/css").Include("~/Content/bootstrap.css", "~/Content/site.css");
        //ここで↓の変換クラスをセットする
        addBundle.Transforms.Add(new FileHashVersionBundleTransform());
        //Bundleの追加
        bundles.Add(addBundle);
    }
}

//IBundleTransformでクエリ文字列を付加するように定義
//キャッシュされてるCSSをクエリストリングでファイルの更新日を付けて認識を変える
public class FileHashVersionBundleTransform : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        foreach (var file in response.Files)
        {
            string version = System.IO.File.GetLastWriteTime(System.Web.Hosting.HostingEnvironment.MapPath(file.IncludedVirtualPath)).ToString("yyyyMMddHHmmssfff");
            file.IncludedVirtualPath = string.Concat(file.IncludedVirtualPath, "?v=", version);
        }
    }
}

結果は↓の感じ。

<link href="/Content/site.css?v=20160508113250" rel="stylesheet"/>

参考にしたのはココ。っていうかまんまですが。

上のサイト見てて思ったけど、このクエリ文字列って「キャッシュバスティング(cache-busting)」って言うのかしら。

2017/8/6追記:Ver2

paintでモザイク

昔どこかで見たやつ。特にすごい技とかじゃないんだけど、地味に使うのでちょっと書いておこうかと。

paintで縮小と拡大を繰り返すとモザイクっぽくなるという話。画像で公開する際に、地味に使う。↓の感じ

sample

.Net COMエラー:80040154

久しぶりにCOMエラーに遭遇した。.Net MVCのアプリで。↓の感じのエラー。

含むコンポーネントの COM クラス ファクトリを取得中に、
次のエラーが発生しました: 80040154

基本的にコレが出るときは使おうとしてるdllとかocxがregsvr32で登録されてない場合。なので下の感じでdllを登録する。

regsvr32 C:\Windows\System32\hoge.dll

64bitの場合は下にあるかもね。

regsvr32 C:\Windows\SysWOW64\hoge.dll

いつもはこれで上手くいくんだけど、今回はダメだった。調べてみると、AnyCPUになってるとダメになることがある模様。使う先のDLLに合わせないとダメらしい。

で、やってみたけどまだダメだった。

最終的にIISのアプリケーションプールの「32bitのDLLを有効にする」をTrueにしないとダメみたい。

iissample

.net MVCで環境変えたら403

.net MVCのサーバをちょっと変えたら403で動かなくなった。調べてみると、web.configに以下を入れるといいらしい。

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  <handlers>
    <remove name="UrlRoutingHandler"/>
  </handlers>
</system.webServer>

これでとりあえず動いた。参考にしたのはココ

jQuery.extend()でハマる(配列)

jQueryのextend()で若干はまったのでメモ。

オブジェクトのマージをしてくれる便利関数。プラグインとして定義している機能の引数にデフォルト値とかを突っ込んでおくのによく利用するんだけど、配列はダメっぽい?まぁ多分、自分のプラグインの作りがダメなんだろうけども・・・。

例えば下の感じのオプションを定義してるとして、

//プラグインのパラメータ初期値 設定
var settings = {
    mainwidth: 800,
    mainheight: 400,
    paddingx: 30,
    paddingy: 30,
    dataset: [],//これがダメ
    clickfunction: function () { }
}

「init:」の中で下の感じで引数を受け取る。

//プラグインのパラメータ設定。「options」が引数
settings = $.extend(true, settings, options);//とりあずディープコピー。

これだけだとdatasetがおかしくなる場合がある。例えば、下の感じでプラグインを呼ぶとして、

$('#targetDom').somethingPlugin(****);

↑をページ内で引数の配列の中身を変えて何回か呼ぶ場合、要素数が一番大きい配列でプラグイン内のdatasetが固定される。何回呼んでも。。。

あんま調べてないので、今は下の感じで、配列だけ別に代入してる。

//プラグインのパラメータ設定。「options」が引数
settings = $.extend(true, settings, options);//とりあずディープコピー。
settings.dataset = options.dataset;

必須のオプション以外では使えませんね。。。。

問合せ