【ASP.NET】 OwinStartupAttribute を含むアセンブリが見つかりませんでした

ASP.NETの開発備忘録です。
1strentalserver(ファーストレンタルサーバー)でサイトの移動の作業中に下のようなメッセージが出てしまいました。
‘*****.***’ アプリケーションでサーバー エラーが発生しました。
アプリケーションを読み込もうとして、次のエラーが発生しました。
– OwinStartupAttribute を含むアセンブリが見つかりませんでした。
– Startup クラスまたは [AssemblyName].Startup クラスを含むアセンブリが見つかりませんでした。
OWIN 起動検出を無効にするには、appSetting owin:AutomaticAppStartup (値は “false”) を web.config に追加します。
OWIN 起動アセンブリ、クラス、またはメソッドを指定するには、完全修飾起動クラス名または構成メソッド名を指定した appSetting owin:AppStartup を web.config に追加します。
レンタルサーバの環境と開発環境の差が出て、Startup クラスを含むアセンブリが見つからないのかな?
詳しく調べればわかるかもしれませんが、今回は時間もないので、エラーメッセージ通りにOWIN 起動検出を無効にすることにします。
config.sysファルに以下を追加します。

 

<configuration>
<appSettings>
<add key=”owin:AutomaticAppStartup” value=”false” />
</appSettings>
</configuration>

 

ローカル開発環境でエラーが出ないことを確認して、発行を行い確認しましたが、エラーはなくなり正常に表示されるようになりました。
初めて見たエラーだったので、とりあえず対応を開発備忘録として残しておきます。
以上、OwinStartupAttribute を含むアセンブリが見つかりませんでしたの対応備忘録でした。

【ASP.NET】ASP.NET 2015で空のtrが勝手に消される不具合

ASP.NET 2015の不具合と確定していないのですが、ASP.NET 2015で空のtrが勝手に消される不具合に遭遇しました。
なので一応、システム開発備忘録しておきます。

具体的な不可解な現象を引き起こしたコードは以下の通りです。

<table>
  <thead>
    <tr><tr>
  <thead>
<table>

  ↓ ※確実にセーブしてもどのタイミングかわかりませんが、以下のようになります。

<table>
  <thead>
  <thead>
<table>

空のtrが不要なタグと判断されたのかな?
実際、今までこのようなケースが無かったので、ASP.NET 2015の不具合かどうかもわかりません。
が、数回同じ現象が起きたので、条件によって引き起こされているのかな?

今回は下のような、動的にth要素をコピーするプログラムを書いていたので、

$(this).clone(true).appendTo($("#tableH > thead > tr");

空のtr(td要素を持たない)をhtmlに書き込んでいました。
静的なhtmlでは空のtr(td要素を持たない)は意味ないですからね。。。

で不具合の対策は、いろいろ考えるのは面倒なので、次のように変更しました。

$("#tableH > thead").append("<tr></tr>");
$(this).clone(true).appendTo($("#tableH > thead > tr");

今回は、空のtr(td要素を持たない)が消えてなくなる(削除される?)とは思って居なかったので、不具合を探すのに少し戸惑いました。
こんなケースも有るんだなぁ・・・程度の備忘録です。

以上、ASP.NET 2015で空のtrが勝手に消される不具合報告でした。

【ASP.NET】 ajax post で、404エラーとなってしまう

今日はajax postで長文を送った場合にエラーになってしまった場合の対策備忘録です。
サーバはWindows IISです。

今までは普通に送れていたのに、長文にした時にエラーになってしまう場合は、IISにはじかれていると考えられます。
ちなみにデフォルトは何バイトか調べて居ません。

で、まずはエラーの内容確認

$.ajax({
   		type: "Post",
   		url: "************",
		contentype: "application/json"
		dataType:"json",
   		success: function(msg){
			document.open();
			document.write(msg);
			document.close();
   		},
   		error: function(XMLHttpRequest, textStatus, errorThrown){
			msg="--- Error Status ---"
			msg=msg+"<BR>"+"status:"+XMLHttpRequest.status;
			msg=msg+"<BR>"+"statusText:"+XMLHttpRequest.statusText;
			msg=msg+"<BR>"+"textStatus:"+textStatus;
			msg=msg+"<BR>"+"errorThrown:"+errorThrown;
			for(var i in errorThrown)
			{
				msg=msg+"<BR>"+"error "+i+":"+ errorThrown[i];
			}
			document.open();
			document.write(msg);
			document.close();
   		}
	});

エラーコードは次のような感じです。
 404.13 : コンテンツの長さが長すぎます
 404.14 : URL が長すぎます
 404.15 : クエリ文字列が長すぎます

各々は以下のパラメータで対応できます。
 maxAllowedContentLength
 maxUrl
 maxQueryString

具体的には、web.congigの中に下のような感じで記述します。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <requestLimits
           maxAllowedContentLength="30000000"       
	   maxUrl="300"       
	   maxQueryString="10000"/>   
	</requestFiltering>
  </security>
 </system.webServer>
</configuration>

で、今回の備忘録はajax postで長文を送った場合にエラーとなった場合への対応備忘録ですので、コンテンツが長い場合、URLが長い場合は調べて居ませんが、
クエリー文字列が長い場合、上の対応をしたとしても、実はまだエラーになります。

※クエリー文字列が長すぎる旨のエラーになってしまいます。

で、どうすれば良いかと言うともう一つ「maxQueryStringLength」パラメータを設定してあげます。
やはり、web.configの中で設定するのですが、

<configuration>
  <system.web>
    <httpRuntime maxQueryStringLength="10000" />
  </system.web>
</configuration>

私の環境では、

<configuration>
  <system.web>
    <httpRuntime targetFreamework="4.5" maxQueryStringLength="10000" />
  </system.web>
</configuration>

となりました。

これで長い文字列を含むajax Postでも正常にIISで受け付けてもらえました。

以上、ajax postで長文を送った場合にエラーとなった場合への対応備忘録でした。

【ASP.NET】javascriptから見たidについて

今回は、ASP.NETネタです。
クライアントサイドでJavaScriptを使用して操作を行う場合、ASP.NETで設定されるidで迷う場合があります。

場合があると言うのは、シンプルなaspxページの場合は、タグに付けたidがそのまま使用されます。
なので、JavaScriptで記述するさいもidをそのまま記述できます。

ところが、複雑というかマスターページを使用s田場合や、GridViewとかMultiViewのように配下にコントロールを持つようなコントロールを使用した場合には、そのままタグに付けたidを記述するとができません。
と言うのは、親のコントロールidをプレフィックスした形式でidが書き換えられています。
具体的には、マスターページを使用した場合はマスターページにContentPlaceHolderが使用されています。デフォルトの IDは「ContentPlaceHolder1」となっていますので、その中にdivタグを追加して、idを「div1」とした場合は、javascriptに記述するidは「ContentPlaceHolder1_Div1」となります。

これはasp.netが独自に創生したコントロールと人が作成したコントロールのidが重複しないようにするためにされていることなので、
単純に配下に作られたコントロールのidに親のidを頭に付加して重複を避けようと工夫された産物です。

以前はそうなんだと納得し、記述する際に面倒だなぁ。。。デバッグでイベントが発生しないと、あぁあれか。。。となっていました。
しかし、ASP.NET 4 からはどうやら更に工夫がされたようです。
それは、ClientIDModeと呼ばれるプロパティが追加されていました。

ClientIDModeは、idを生成するルールを選択するプロパティが設定できます。

設定値 ルール
AutoID 今まで通り。自動でidが生成される
Static 手で設定したidがそのまま使用される。重複しないように開発者が注意
Predictable ClientIDRowSuffixプロパティ値を参照して生成される

使うとしたら、Staticでしょうか。
Predictableは余計に面倒になるだけのような。大規模開発の場合は予めわかっていた方が便利なのかな?それでもid命名規約を作ればいいことだし。。。

いろいろ有りますが、idの重複をしないようにするための工夫なので、その点を意識して開発すれば問題無いと思います。

以上、ASP.NETネタでした。

【ASP.NET】RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます

前回の続きです。
GridViewを利用したExcelファイル出力の際に、『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』のエラーになってしまう対応の続きです。

前回は、

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' このOverridesは以下のエラーを回避するために必要です。
    ' 「GridViewのコントロールGridView1は、runat=server を含む
    '  form タグの内側に置かなければ成りません」    
  End Sub

を入れることで、VerifyRenderingInServerFormをOverridesして、サーバー フォーム要素の表示方法が異なっているページは、異なった条件の下でこのメソッドをオーバーライドして例外をスローしました。
第一関門突破です。

しかし、『RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます』
が発生するようになりました。
どうやらGridViewの列にButtonFieldやCommandFieldを使用している場合に、PostBackを検証対象処理として登録を行う際にRegisterForEventValidation を呼び出すようで、この中で Render 中かどうかがチェックされてしまうようです。

で、さらにググると、このチェックを行うかどうかは EnableEventValidation プロパティで制御できるようです。

    Public Overrides Property EnableEventValidation() As Boolean
        Get
            ' 「RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます。」
            ' を出ないようにする
            Return False
        End Get
        Set(ByVal value As Boolean)
        End Set
    End Property

これでエラーが発生せずExcelファイルの出力が可能になりました。
めでたしめでたし^^

ただ、単純にFalseにすると、今回の私のように入力コントロール等があるGridviewの場合、セキュリティ上まずいと思われるので、Excelファイルを作るときのみFalseになるように制御しないといけないと思います。

今回は気になったので調査しました。
以上ASP.NETのシステム開発備忘録でした。

【ASP.NET】GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません

今回はたまに使うGridViewを利用したExcelファイル出力の備忘録です。
Webフォームに更新可能でソートも可能なGridViewを作成しました。
帳票を作るときは、画面で仕様が固まった後、PDFもしくはEXCELをGridView経由で出力できるようにしています。

データ更新できるGridviewにすると、EXCEL出力する際にinputコントロールやSelectコントロールまで付いてしまうのでいつもは画面用のGridViewを流用することはしないのですが、何気なく流用してみたところエラーが出てしまいました。

『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』
です。
グッグってみたところ、

このコードを付け加えてみてください。
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
End Sub

と言う記述を発見しました。

もう少し調べると
VerifyRenderingInServerFormの解説に、

<form runat=server>タグの内側に配置する必要があるコントロールが、表示される前にこのメソッドを呼び出すことができます。その
ため、そのようなコントロールがタグの外側に配置された場合、エラー メッセージが表示されます。登録したスクリプト ブロックをポストバックするコントロール、または登録したスクリプト ブロックに依存するコントロールは、Control.Render メソッドのオーバーライド部で、このメソッドを呼び出す必要があります。サーバー フォーム要素の表示方法が異なっているページは、異なった条件の下でこのメソッドをオーバーライドして例外をスローできます。

上のこのコードを付け加えてみてくださいとは、「異なった条件の下でこのメソッドをオーバーライドして例外をスローできます」のアドバイスに従ったものだとわかりました。

他のページには、更に

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' このOverridesは以下のエラーを回避するために必要です。
    ' 「GridViewのコントロールGridView1は、runat=server を含む
    '  form タグの内側に置かなければ成りません」    
  End Sub

のように親切に書かれているものもありました。

早速、試してみたところ、該当の『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』は出なくなりましたが、新たなエラーが。。。

『RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます』
が発生するようになりました。

これの対策はまた後日。。。

【ASPNET】ASP.NET VB GridViewのヘッダーに行を追加する

今回は以前に試したGridViewのヘッダー行を1行追加するプログラムの備忘録です。
ヘッダー行を複数行にするとPostBackを行った時に、データバウンドでおかしなことになるのですが、それが避けられるケースで有れば有効かと思います。
私はこの方法を使ったことは無いのですが、将来使うかもしれないし、試していないのですがPDFファイルとGridViewから作成するのに使えるのかな?と思っています。

下の例では、行にデータを張り付けたタイミングで追加しています。
この他にもレンダリングの前でも全てのデータ張付け後でも可能と思います。

Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

If e.Row.RowType = DataControlRowType.Header Then
  Dim row As GridViewRow = New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)
  For i As Integer = 0 To 11
    Dim cell1 As TableCell = New TableCell()
    cell1.Text = i.tostring + "月"
    row.Cells.Add(cell1)
  Next
  row.RowType = DataControlRowType.Header
  Me.GridView1.Controls(0).Controls.AddAt(1, row)
endif

プログラムは簡単で、GridViewのRowを定義して、その中にCellを追加し、GridViewにRowを追加するだけです。

尚、追加した行をDataControlRowType.Headerとしているのですが、PostBackして再度データを張り付ける時に、追加したヘッダー行にデータを張り付けようとする動きになりました。
どうしてそのような挙動になるか理由は不明です。
ですから、PostBackするような場合は注意が必要です。

以上、VB.NETでGridViewにヘッダー行を追加するシステム開発備忘録でした。

ps.
PostBack時の不具合の原因ですが、他の調査をしていてわかったかもしれませんので、リンクを貼っておきます。
ASP.NET VB GridViewのヘッダーに行を追加する(修正版)

Visual studio Express 2015 ナビゲーションバー

現在、簡単な開発にVisual studio Express 2015を使っています。
慣れる必要も有るので。

で、VS 2013までは、VBエディターとかC#エディターの上部にクラス名とメソッド名が表示されて、オブジェクトのクリックイベントとかそこから簡単に宣言できましたが、VS 2015ではデフォルト表示ではなくなったようです。
まだ、Express 版しか触って無いので、他のエディションでは違うのかもしれませんが。

で、HTMLタグでボタンを作る人には、表示されていないと不便ですよね。
私もASP.NETの標準タグよりも扱いやすいので、HTMLタグを良く使います。

表示する方法は知っていれば簡単なことで、予測で探すこともできますが、備忘録として書き留めておきます。

Visual studio Express 2015 ナビゲーションバー

Visual studio Express 2015 ナビゲーションバー表示

1)ツール>オプションを開いて
2)テキストエディタを展開
3)Basic,C#の全般をクリック
4)ナビケーションバーを選択

以上で、今まで通りナビケーションバ―が使えます。
と言うか、そういう名前だって初めて知りました^^;

以上、開発備忘録まで

【ASP.NET】Visual Studio をインストールした後に IIS をインストール

PCにVisual Studio をインストールした後に IIS をインストールした場合、IISにASP.NETの再登録をする必要があります。

今回、IIS Expressでデバッグをしていたのですが、ちょっとデバッグし辛い構成になっていたため、ローカルIISでデバッグすることにしました。
そのため、Visual Studio をインストールした後に IIS をインストールという形になりました。

まずは、IISのインストールをして。
IISのインストールはWindows7環境でしたので、「Windowsの機能の有効化または無効化」からIIS機能(インターネット インフォメーション サービス)を使えるようにチェックボックスをONして、適当に配下の機能もチェックONしました。

再起動してローカルIISが表示されるのを確認

しかし、ここでローカルIISを選択しても、もちろん「IIS メタベースにアクセスできません。コンピューター上の IIS Web サイトにアクセスするための十分な権限がありません」などと怒られます。
そこで、おまじないのaspnet_regiisコマンドでASP.NETの再登録をします。
コマンド プロンプト ウィンドウを管理者権限で起動し、「systemroot\Microsoft.NET\Framework\ versionNumber \aspnet_regiis -i」というコマンドを実行します。
私のPCの環境では、C:\Windows\Microsoft.NET\Framework\v4.0.30319にありました。
ちなみに、Frameworkは今回はFramework4.0(4.5)を使用するので、v4.0.30319ですが、使用するFrameworkのバージョンのディレクトリを選びます。
今回はFramework4.0(4.5)しか使用しないので、
・aspnet_regiis.exe -u
・aspnet_regiis.exe -i
を実行しました。
aspnet_regiis01
ググるといっぱい出てきますので詳しく知りたいときは、更に検索してください。

で、これで終わりではないです。
Microsoftからのアナウンスでは、「Visual Studio のディスクを挿入し、セットアップ プログラムを実行して、[修復/再インストール] をクリックします。 この手順で wwwroot$ 共有が作成され、適切なアクセス特権が追加されます。 」と出てますので、この方法でOKなのかもしれません。でも、面倒ですよね。。。
そこで、IISフォルダーにアクセス権限を付与します。
C:\inetpub\wwwroot以下にUsersを追加します。私はアプリからファイルを更新するので変更も許可しましたが、普通は変更は要らない?かも、、、
あっ、ちなみにWindows7、VS2013、IIS7の環境です。以前のバージョンだと許可するアカウントが異なるので、ググって調べるてください。

これで、ローカルIISを選択できるようになりましたが、これではたぶんデバッグができません。
「webサーバーでデバッグを開始できません。起動されたURLに一致するWebサイトはIISの一覧に含まれていません。」と怒られます。なんだかなぁ?面倒だなぁ。。。
で、どうすればいいかというと、
1.管理者特権レベルで動かす(簡単なのでお勧め)
  Visual Studioの起動時に管理者として起動るようにするか、
  毎回のことならプロパティの互換性の特権レベルの管理者としてプログラムを実行するにチェックを入れる。
2.Webサーバと同じユーザアカウントでVisual Studioを実行するか、実行ユーザアカウントに管理者特権を付与する。
  これはやったこともないし、なんかやりたくもないけど、、、
  Webサーバー プロセスをデバッグするアクセス許可がないからだそうで、許可をもらえるようにするんですね。
  ひょっとしたら、デバッグはIISの認証で匿名じゃなくてWindows認証が要るかも。。。試してないのでわかりませんが。。。

上の一連の作業でとりあえずはローカルIISでデバッグできます。
OSやツールのバージョンの組み合わせでアカウントが変わるので、ちょっと試してダメだったら、試行錯誤するより再インストールした方が早いけどね~^^

以上、備忘録まで

【ASP.NET】Web.configのConfig変換を追加が有効になってない?

システム開発環境ネタです。

Visual Studio 2010?から、Web.configを発行する際にReleaseやDebugなど切り替えられるようになっています。
デフォルトでは検証用(Debug)、本番用(Release)の二つの切り替えが用意されていますが、ビルドの構成マネージャーで増やすことも可能です。

今回もVisual studio Community 2013で本番向けのDB接続やURLを切り替えるために使用しようとしたところ、
Config変換を追加がグレー表示され「有効にできな状態」でした。。。
先に結果を書きますが、ソリューション エクスプローラーの表示がすべてのファイルを表示するになっていなかったため、Config変換の追加が有効になっていないと勘違いしていたという落ちです。。。

ちなみに、この機能はMicrosoft ASP.NET and Web Toolsがインストールされていれば有効になります。

実際にフォルダーのファイルを確認するか、発行時の出力をチェックすれば悩まずに済んだのに。。。

とりあえず、また同じ目に遭わないように備忘録して記憶に留めやすくしておきます。