アーカイブ

Posts Tagged ‘ASP.NET’

EntityFramework のマイグレーションで複数のContextが含まれる場合は -c (-context)オプションを利用する。

Dataプロジェクトに
AppDbContext と AuthDbContext という複数のコンテキストがあった場合、普通にdotnet ef migrations add とかするとこんな感じで怒られるので

More than one DbContext was found. Specify which one to use. Use the ‘-Context’ parameter for PowerShell commands and the ‘–context’ parameter for dotnet commands.

-c もしくは -context オプションを利用する。
https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/providers

さらに複数のコンテキストのマイグレーションが同じフォルダーで混ざると気持ち悪いので、-o -output オプションを付けてマイグレーションフォルダーを分けると嬉しい

dotnet ef migrations add InitAppDbContext -c AppDbContext -o Migrations/App
dotnet ef migrations add InitAuthDbContext -c AuthDbContext -o Migrations/Auth

もちろん dotnet ef database update 時にも -c をつけるのをお忘れなく

dotnet ef database update -c AppDbContext
dotnet ef database update -c AuthDbContext
広告
カテゴリー:ASP.NET, MySql タグ: ,

Visual Studio 2017 15.8でdocker-composeを利用する場合は、コンテナオーケストレーターレーターサポートからdocker-compose.ymlを追加する

Visual Studio 2017 バージョン 15.8 で Docker サポートを有効にした ASP.NET Core のアプリケーションを作ったら、docker-compose.yml が自動的に追加されなかったのでメモ

Visual Studio Tools for Docker と ASP.NET Core」の「アプリにコンテナー オーケストレーター サポートを追加する」を参照すると、下記のような記載が追加されていた。

Visual Studio 2017 バージョン 15.8 以降では、指示された場合にのみ、オーケストレーション ソリューションが追加されます。 ソリューション エクスプローラーでプロジェクトを右クリックして、[追加] > [Container Orchestrator Support](コンテナー オーケストレーター サポート) の順に選択します。 Docker Compose と Service Fabric という 2 つの異なる選択肢が提供されています。

MSDNにある通り、プロジェクトのプロパティー > 追加 > コンテナオーケストレーターサポートを選択し、
DockerComposeの追加1

Docker Compose を選択すると、
DockerComposeの追加2

ベースイメージを Windows にするか Linux にするかを尋ねられるのでOSを選択する。
DockerComposeの追加3

ソリューションに docker-compose が追加され、スタートアッププロジェクトに設定される。
DockerComposeの追加6

こんな感じの docker-compose.yml が追加される。

 version: '3.4'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY}webapplication1
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

複数のプロジェクトに対してコンテナオーケストレーターサポートを追加すると、docker-compose.yml に設定が追加されるので、必要に応じてdepends_onを設定すればよい。

version: '3.4'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY}webapplication1
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

  webapplication2:
    image: ${DOCKER_REGISTRY}webapplication2
    build:
      context: .
      dockerfile: WebApplication2/Dockerfile
カテゴリー:ASP.NET, Docker タグ: ,

ついにこの時が、、、No More WebForms, No More Visual Basic

Top 10 Changes in ASP.NET 5 and MVC 6

いや、わかってたんですよ。わかってはいましたが、、、

No More Web Forms

You can continue to build Web Forms apps in Visual Studio 2015 by targeting the .NET 4.6 framework. However, Web Forms apps cannot take advantage of any of the cool new features of ASP.NET 5 described in this list. If you don’t want to be left behind as history marches forward then it is finally time for you to rewrite your Web Forms app into ASP.NET MVC.

超意訳

引き続きVisual Studio 2015でも.NET 4.6を選択すればWebFormsのビルドを行うことができます。しかし、ASP.NET WebFormsではASP.NET 5の新機能を利用することはできません。これはASP.NETの進化に取り残されたくない場合ASP.NET WebFormsアプリをASP.NET MVCアプリに書き換えるための猶予期間なのです。

カテゴリー:ASP.NET, Visual Basic タグ:

kproj と KRuntimeってなに??

ASP.NETのソースコードがGitHubで公開されたというので、とりあえずさらっと眺めようかとソースを取り寄せてVisual Studioでソリューションファイルを読み込んでみると、各プロジェクトは 「kproj」 という拡張子を持つプロジェクトファイルで構成されているようでVisual Studioで読み込むことができませんでした。

kprojってなんだろう。

ASP.NET vNext HomeをみるとGetting StartedにK Version Managerへのリンクが貼られています。どうもASP.NET vNextの開発はK Runtimeという開発時と実行時のランタイムの溝を埋める環境で開発されているようです。kprojはこのK Runtimeで動作するプロジェクトを作成するためのプロジェクトファイルみたいです。

でもって、今のところkprojを理解するためのVisual Studioの拡張機能はなさそう。そのうち出てくるんだろうけれど、ソースを見たいならテキストエディターやらで確認するしか無いのかな?

カテゴリー:ASP.NET タグ:

何故かクッキーレスセッションになってしまった

IE11が電撃的に自動配布されたわけですが、皆様いかがお過ごしでしょうか?

IE11が自動配布されたクライアントで、何故かASP.NETのセッション情報がクッキーレスセッションで運用される状況になったので対応をメモ。現在現象発生まち。。。

IE11の自動配布について

今回は開始されまでが早かったですね。去年このブログのエントリーは確認していたんですが、自分の環境のIE11では問題なく動いていたので、今週の配布で問題が出るとは思っていませんでした。

2014 年 1 月第 2 週目から順次、Windows 7 向けInternet Explorer 11 の自動アップグレードを開始します

ブラウザー定義ファイルの更新

ASP.NETでブラウザーの更新における問題というと、ブラウザー定義ファイルの更新漏れが考えられるのでまずはこちら。_doPostbackが定義されていないとか言ったJavascriptのエラーが出るならまずは確認してみましょう。

セッション情報と認証情報は無条件にクッキーへ

いや、いまさらクッキー使えない端末とか無いから気にしないでクッキーへ書こうよということなら、web.configのforms要素とsessionState要素の設定をUserCookiesで指定してあげます。

カテゴリー:ASP.NET, プログラミング, Windows タグ: ,

IE10 関連リソース

先日、Windows 7 対応のInternet Explorer 10がリリースされました。

普段使っていく文には、高速化、リッチコンテンツへの対応というメリットがありますが、提供する側としては検証ブラウザー対象のブラウザーが増えるのでちょっと大変ですね。とりあえず検証用のリンクをメモしておきます。

まずは代表的な2つのURL

上記の中でリンクされている中で、特に気にしておいたほうがよさそうなもの

で、更にASP.NETがInternet Explorer 10の検出に失敗するに関しては、サーバー側の設定ファイルの変更が必要なので、ココも合わせてみたい。

Bug and Fix: ASP.NET fails to detect IE10 causing _doPostBack is undefined JavaScript error or maintain FF5 scrollbar position

カテゴリー:ASP.NET, Windows タグ: ,

ASP.NET 4 WebFormでモバイルサイトを作成する場合のスクリプト結合

これはOne ASP.NET Advent Calendar 2012の12/17日分の記事となります。前回の記事はnobuhisaさんの「知っている人は知っている、知らない人は知らない『NDjango』」です。次回の記事はnakamura_toさんです。

。。。やべっす。書くネタが無いです。ASP.NETといっても、いろいろありますが基本WebFormしか触っていないので、ちょうど都合よく発生した、お仕事で困ったことで逃げるとします。

スクリプトがいっぱい

少し前ですがWebFormとjQueryMobile、knockoutを基盤に使ったシステムの開発方針を決めたことがあります。もともと単純な機能しか利用しないし画面もそう多くないのででさらっと作れればいいよーという話だったので、メンテナンス性を考え、ページはViewModel毎に1つのJavascriptファイルと、ViewModelが利用するサービスクラスが名前空間毎にファイルを分けて作成することにしました。

開発が終盤になり、なんとなくソリューションを覗いてみたら、画面や機能はどんどん追加され、Javascriptだけでも40以上がマスターページに登録されていました。

スクリプトのロードを早くしたい

ASP.NETでjQueryMobileなページを作成する場合、どのページからランディングされても動くように、マスターページ側でそのサイトで利用する全てのスクリプトをロードさせます。このため、初めてのそのサイトにアクセスの場合は、数十のスクリプトがロードされることになり、場合によってはそれなりにロード時間がかかります。

Fiddlerでネットワーク帯域のエミュレートをしながらダウンロードを調査してみました。Fiddlerでのネットワーク帯域の制限方法はココが参考になります(→Android開発で3G回線速度を再現する)。近頃のモバイルネットワークは高速ですが、今回は下りが大体512kbpsぐらいに制限して調査してみます。

image image

タイムラインは下のほうが切れてしまっていますが、ページ全体で758KBの読み込みで、2.8秒の時間がかかっています。

ASP.NET 4 WebFormでの解決案

ASP.NET 4.5では、System.Web.Optimization名前空間を使った便利な仕組みがあるようなのですが、ASP.NET 4な環境では使えません。チャックさんのJavaScript / CSS ファイルの自動縮小・結合処理: ASP.NET MVC 4 新機能シリーズがわかりやすいです。

ASP.NETでは古くからのScriptMangerコントロールにも、スクリプトの結合機能(クライアント スクリプトを複合スクリプトに結合)があります。今回はScriptManagerのスクリプト結合機能を利用してjQueryやknockout, jQueryMobileのスクリプトを結合することでスクリプトのロードが早くなるかを検証します。

ScriptManagerのCompositeScript機能を利用したスクリプトの結合

まずはマスターページを開いて、ScriptManagerを追加します。

今回、ASP.NET AJAX関連JavaScriptは読み込む必要は無いのでAjaxFrameworkModeをDisabledに変更しています(あっ、ScriptManagerはrunat=”server”なformの中に置きましょうね。ココの記事ではformを消してしまいましたが、無いと上手く動いてくれません)。

<asp:ScriptManager runat="server" AjaxFrameworkMode="Disabled">
<CompositeScript>
    <Scripts>
        <asp:ScriptReference Path="~/Scripts/json2.min.js"/>
        <asp:ScriptReference Path="~/Scripts/jquery-1.7.2.min.js"/>
        <asp:ScriptReference Path="~/Scripts/jquery.validate.min.js"/>
        <asp:ScriptReference Path="~/Scripts/knockout-2.1.0.js"/>

        <asp:ScriptReference Path="~/Scripts/jquery.mobile-1.1.0.min.js"/>
        <asp:ScriptReference Path="~/Scripts/jquery.mobile.datebox.min.js"/>
        <asp:ScriptReference Path="~/Scripts/jquery.mobile.datebox.i8n.jp.js"/>
    </Scripts>
</CompositeScript>
</asp:ScriptManager>

さて実行するとどうなるかな?。。。。。。ありゃ、Javascriptのエラーが出ちゃいました。どうもjson2が上手く読み込めていない様子なので、外に出してあげます。

image

マスターページのコードはこうなりました。

<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site1.master.vb" Inherits="WebApplication6.Site1" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5.0,user-scalable=yes"/>
    <link href='~/Content/jquery.mobile-1.1.0.min.css' rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src='<%= ResolveClientUrl("~/Scripts/json2.min.js") %>'></script>
    <asp:ContentPlaceHolder ID="Head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form runat="server">
    <asp:ScriptManager runat="server" AjaxFrameworkMode="Disabled">
        <CompositeScript>
            <Scripts>
                <asp:ScriptReference Path="~/Scripts/jquery-1.7.2.min.js"/>
                <asp:ScriptReference Path="~/Scripts/knockout-2.1.0.js"/>

                ... 略 ...

                <asp:ScriptReference Path="~/Scripts/jquery.mobile-1.1.0.min.js"/>
                <asp:ScriptReference Path="~/Scripts/jquery.mobile.datebox.min.js"/>
                <asp:ScriptReference Path="~/Scripts/jquery.mobile.datebox.i8n.jp.js"/>
            </Scripts>
        </CompositeScript>
    </asp:ScriptManager>
    </form>                
    
    <asp:ContentPlaceHolder ID="Contents" runat="server">
    </asp:ContentPlaceHolder>
</body>
</html>

どかなー

とりあえず適当なページを作って実行すると、問題なく表示されましたね。

image

コンテンツのロード状況を見ると、ページ全体で239KBの読み込みで1.9秒の時間がかかっています。ページのサイズとしては500KBの軽量化、ページのロード時間としては1秒ぐらい早くなっています。ScriptManagerのComposit機能では、スクリプト自体の圧縮を行わないのでこんなものでしょうかね。

imageimage

Ajax Minifierでビルド時にスクリプトファイルを圧縮してあげると、スクリプト自体のサイズが小さくなるのでもう少し早くなるかもしれませんね。

カテゴリー:ASP.NET, インフラ, モバイル タグ: