FC2ブログ
Classic ASP の環境でリクエストを完全にマルチスレッド化させる方法
このタイトルが適切かはわからないが適当に('A`)y~~~
既にClassicASPでシステムを構築していた場合の話ね('A`)y~~
そんな奴はもういないと思うがな('A`)y~

たぶん、IISをインストールしたデフォルトだとMTAを使わない設定になっているはず。
なので最初にサーバーの設定を変更する。
IISマネージャを開いて、ASP -> COM+プロパティ -> MATで実行する を true にする。

次にaspで連想配列を使うためのクラスを変更する。
Server.CreateObject("Scripting.Dictionary") STA only 
Server.CreateObject("System.Collections.Hashtable") BOTH

たぶん、上記の変更により動かない箇所が出てくるので直す。
以上。

IISサーバーを再起動すればリクエストがマルチスレッドで処理されるようになる。

詳しいことはCOM の詳しい人に教えてもらうのが一番
ttps://www.kekyo.net/category/com

スポンサーサイト
Web Deploy が失敗する
たぶん古いVisual Studio とかをアンインストールしたからなのだと思うのだが
Web Deploy が失敗する。
下記のようなエラーがでるのよ('A`)

--
Web Deploy タスクに失敗しました。(リモート エージェント URL 'https://host/msdeploy.axd?site=site-name' に対する要求を完了できませんでした。)

リモート エージェント URL 'https://host/msdeploy.axd?site=site-name' に対する要求を完了できませんでした。
要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした
--

これが発生する環境は、
サーバーが Windows2008R2 
クライアントがWindows10 + Visual Studio 2017 Ver 15.9.1

どっちのOSもほぼ更新パッチは当たっている

いろいろと調査したら下記の方法で対処できた。

Visual Studio 2017 起動し、デプロイしたいプロジェクトがあるソリューションを開く。
次にメニューのツール -> Nuget パッケージ マネージャ -> Nuget パッケージ マネージャコンソールを開く。

下記のコマンドを実行する
# [System.Net.ServicePointManager]::SecurityProtocol 

Ssl3, Tls 
と表示されればOK。されなければ下記のコマンドを実行する

# [System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Ssl3

ただし、VSを起動しなおすたびに行う必要があるので面倒。

Web Deploy はpowershell 経由で通信を行っていると思う。設定を変えたら動いたし。。。
んで、デプロイ先のIISサーバーとのセキュアな通信を確立するための
プロトコルをクライアントがTls1.2しか使用しないよっていってるから
IISサーバーとの通信ができないのだと思う。

IISサーバーに入っているWeb Deploy ツールのバージョンにも依存するかも?
クライアントは3.6 で、サーバーは3.5なのでこの違いはあるかもしれない。
この辺は調査が必要かも('A`)

Visual Studio Code でASP.NET Core Web Application
まずは、Visual Studio Code をインストールする。
次に、.NET Core SDK (現時点では2.1)をインストールする。

Visual Studio Code を起動し、拡張機能でC# for Visual Studio Code をインストールする。
VSCodeのウィンドウにターミナルがあるので、そこで適当なディレクトリを用意する。

次に下記のコマンドを実行して雛形を作る。
dotnet new mvc
dotnet restore
※その他のテンプレートは公式サイトを確認
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new?tabs=netcore21

実行すると雛形がカレントディレクトリに出来上がり、パッケージの復元が行われる。
続けて次のコマンドを実行する
code .

. を忘れずに。VSCode のワークスペースが雛形の場所になるはず。

あとは、VSCode からの告知で、C# のビルド設定がないから作るよとか言われるので指示にしたがって作る。
あとは、F5キーを押して実行するだけ。

Core 1.0 の頃は、npm を使ってYeoman をインストールして、Yeoman 経由で雛形を作っていたけど、いまは dotnet コマンドに雛形があるから使う必要はない。
Core 1.0 で開発したいときは話は別だが。

Linux とかで.NET Coreの環境を作るときによく見るパターンがYeoman を使っているのが多かった。Core 1.0 でも dotnet new は使えたっぽいが、雛形として優秀なYeoman が使われることが多かったのかもしれない。

ASP.NET MVC のビューでnameof とか使いたいよとか
C#のバージョン6 以降からいろいろと機能が追加されて、nameof とか null伝番?とか
使えるようになっていろいろと便利(コンパイラの名称は Roslyn )。
でも、そのままではMVC のビューではなぜか使えない。
※最近は新規作成で下記のパッケージが入っているので気にしなくてもいいかも。
昔のプロジェクトにはそんなのはなかった('A`)y~~~
ビューは実行時にコンパイルされるので、OSに搭載されている.net のコンパイラが使用される。
なので、このバージョンが古いから使えなのが原因。

で、ビューでも使えるようにするためのNugetには次のようなパッケージが存在する。
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers

この二つを追加すると、web.config にビュー側でRoslynを使う設定が追記される。
また、ビルド時に、/bin/roslyn というディレクトリが作られこの中に、コンパイラがコピーされる。

どこかのサイトで見た覚えがあるのだけど、Webサイトにデプロイすると動かなないらしい。
配置された /bin/roslyn の実行ファイルにアクセス権がないとか。
試しに実験したら普通にデプロイできて、実行してC#6の機能が動作するところまで確認した。 アプリケーションプールもデフォルトのApplicationPoolIdentity を使っている。 もしかしたら、カスタムアカウントに、/bin/roslyn への実行権限がないとかそういう
問題だったのかもしれない

Unity MvcとWebApi の違い
Unity Mvc は System.Web.Mvc.DependencyResolver にUnityコンテナを渡す。
Unity WebAPI は System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver にUnityコンテナを渡す。

そもそもMvc とWebAPI ではリクエストの処理するラインが違うため、依存関係を注入する場所が違っている。
※コントローラー、アクションの選択、生成がそもそも違う。

Mvc でリクエストごとにDispose を呼び出したい場合は
UnityMvcActivator.cs のソースにある下記の行をコメントアウトする。

Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));

また、RegisterType メソッドの引数に PerRequestLifetimeManager のインスタンスを渡す。

WebAPI でリクエストごとにDispose を呼び出したい場合は
UnityHierarchicalDependencyResolver を使って依存関係の解決を行うようにする。
デフォルトでは、UnityDependencyResolver なので変更すること。
また、RegisterType メソッドの引数に HierarchicalLifetimeManager を使う。WebAPIのUnity ライブラリにPerRequestLifetimeManager は存在しない。

Mvc とWebAPI が共存したプロジェクトだと、WebAPI でUnityDependencyResolver を使ってもDispose が呼ばれる。これはPerRequestLifetimeManager のおかげなんだろうけど、ちゃんと仕組みを理解していないため、なんとなく気持ちが悪い。

Mvc で、PerRequestLifetimeManager を使わないで HierarchicalLifetimeManager を使うようにすると、Mvc 側でDispose が呼ばれない。
何か違いがあるのだろう。仕組みを理解しないとだめだなこれは('A`)
TOP
プロフィール

hssamurai

Author:hssamurai
FC2ブログへようこそ!

最新記事
最新コメント

最新トラックバック

月別アーカイブ
カテゴリ