【質問】ASP.NETスレ Part4【議論】

このエントリーをはてなブックマークに追加
937age:2008/11/16(日) 22:34:02 ID:gZOlu/94
ASP初心者です。よろしくお願いします。

多人数が見るサイトを構築する際、ページのインスタンスを保持すべきではない。
という記述をhttp://www.atmarkit.co.jp/fdotnet/dotnettips/043postback/postback.html
の@ITさんで見たのですが、
ポストバックしてきたページは別インスタンスということでよろしいのでしょうか?
また保持すべきではないのは、サーバー側に負荷が掛かるから、という認識でよろしいのでしょうか?

よろしくお願いします。
938nobodyさん:2008/11/16(日) 22:50:10 ID:???
>>937
そのページをちゃんと読めば、常に別インスタンスって書いてあると思うよ。

ページのインスタンスを保持するのが良くないというのは、
一度、表示に利用したインスタンスはすぐ破棄したほうがいい(使いまわわすこともないし)という
ことだと思うんだけど、ポスト後に同じインスタンスにアクセスすることなんてできるんかいな?

>また保持すべきではないのは、サーバー側に負荷が掛かるから、という認識でよろしいのでしょうか?
保持すべきでないというより、保持できないと思ってたんだけど、
違うなら他の人の指摘待ちかな・・・
939nobodyさん:2008/11/17(月) 02:40:45 ID:???
保持はできるんじゃね。
保持したインスタンスをどうやって特定してアクセスするかはしらねえがw

そのページにも保持するなとは書いてないぞ
保持することは現実的じゃないと書いてある

そもそもページのインスタンスそのものを保持する必要性が理解できん
最大限でもViewstateだけ保持すれば事足りると思うんだが
940nobodyさん:2008/11/17(月) 07:39:38 ID:???
>>936
IISなしでASP.NETが動くらしい
941nobodyさん:2008/11/17(月) 19:23:30 ID:???
>>939
ひょっとしてメモリにデータを保持するアクセスカウンタ的な使い方なんかな?
942nobodyさん:2008/11/17(月) 23:59:53 ID:???
ググってみた。日本語で紹介してるサイトもあった。
http://www.moongift.jp/2008/09/aspnetserve/

結局サーバーはwindowsでないとダメなんだよね?
IISは必要ありませんって言われてもあんまりメリットが見えない。
943nobodyさん:2008/11/18(火) 00:29:20 ID:???
VS無しで開発してる人なら有用なんじゃないか?それ以外はメリットあるように思えんが・・・
944nobodyさん:2008/11/18(火) 01:05:05 ID:???
XPのIIS接続数制限を回避したい、とか。なんにしても微妙だけど。
945nobodyさん:2008/11/18(火) 14:33:33 ID:???
VistaHomeや、XPHomeで開発したい人とか。
IISだけの脆弱性を回避したいとか。

Server固有のエラーとかは発生しないものなのかね。
ASP.NETとして動いている部分が100%互換性がないと開発用にも使えないよね。
946nobodyさん:2008/11/18(火) 17:17:24 ID:???
ASP.NET開発サーバがコンピュータ名でアクセスできたらいいんだけどな…
たしかFiddlerとかうまく使えないよね…
いや、IEだったらlocalhostでも使えたかな…
947nobodyさん:2008/11/20(木) 00:38:49 ID:PklGUJ5B
>>939
>保持はできるんじゃね。
インスタンスはASP.NETランタイムが破棄するから保持できなだろ。
保持したいときは静的変数。
948nobodyさん:2008/11/20(木) 10:31:15 ID:???
>>947
いや、だから、それはシステムが保持していないってだけだろ
お前の言うように、破棄される前に静的変数に保存しとけば保持されるはずだろ

んで、それを保持しておくことにほとんどメリットがないから
大元の@ITのページでも現実てきではないと書かれてるんじゃないかね
949nobodyさん:2008/11/20(木) 15:54:43 ID:???
インスタンスを静的変数に保持するってことは、
インスタンスの先頭アドレスのポインタを変数に保存しておくってことでしょ?

でもインスタンスが生存しているか、破棄されているかは.net次第だから、
結局、そんなもの保持してても意味ないと思うんだけど
後で使うから破棄しないでね(ハート なんてできたっけ?
950nobodyさん:2008/11/20(木) 20:34:54 ID:???
いや、>947が静的変数って書いたから静的変数にって書いたけど、
別に静的変数じゃなくてもいいんだが。
インスタンスはそれが参照されていれば破棄されないから
たとえばセッション変数に保持しとけばあとから参照可能じゃね
(セッション変数にオブジェクト入れるなという話はあるんだがなw)

保持できないから意味がないというから、保持できるんじゃないかと思っただけで
できるできないに引っかかっただけだから

実際試したことないんで、保持できなかったらすまんw
951nobodyさん:2008/11/21(金) 20:01:42 ID:???
>>950
そうなるとガーベジコレクタの話になるんかな
なんか不安だから静的変数も必要なくなったらnullを代入しなくちゃいけないんかなと
違うところで不安になってしまった

ま、それはともかく、確かに保持できても意味はないよね
じゃあ、なんのためのSessionやCokkie、ViewStateって話で。

>実際試したことないんで、保持できなかったらすまんw
大丈夫、保持できるかできないかに引っかかってることは理解してるからw

仮に保持できたとして、積極的に保持したほうが便利なんてことがあるのかな。
自分じゃあまり思いつかないな。
952nobodyさん:2008/11/21(金) 22:44:33 ID:???
PageはIDisposeを実装してるので、
参照が残っていても使えなくなってる可能性もありそう

ポインタとか言ってる所を見ると、>>949
単にガベージコレクションの動作を知らないだけだとは思うけど
953nobodyさん:2008/11/23(日) 00:00:10 ID:???
>>952
いや、オブジェクトを変数に格納するということは、
オブジェクトのポインタを変数に格納することと同義だから、
>>949は間違ってるとは言えないと思う

IDisposeは、それが参照しているローカル変数が属するスコープから抜けた場合に
自動的に実行されるものなわけで、スタティック変数やグローバル変数として保持している限り、
ルートオブジェクトから参照できるオブジェクトとして、ガベージコレクタの収拾対象にはならないはず


954nobodyさん:2008/11/23(日) 04:12:49 ID:???
>>953
IDisposeはDisposeメソッドを実装することを強要するだけで、
そのDisposeメソッドが呼び出されることはだれも保証してないと思うんだが

参照が保持されてればGCの対象にならないだけで、
IDisposeがインプリメントされているかどうかは無関係のはず
(ただし、.NETのGCは2段階になってて、正しく実装されたDisposeは
1段階目のGCを抑制することになるが、インターフェィスはメソッドの
実際の実装までは規定してないからな)

>>952はPage.Disposeを呼び出すとそのPageオブジェクトは、たとえ参照が残っていても
使用不可能になってるぞと言ってる

問題は、Page.DisposeはASP.NETが自動的に呼び出すかどうかなんだが
その記述は見つけられなかった。
なんでPage.Disposeは通常は呼ばれないと思ってるんだが、
ページ上のサーバコントロールについてはDisposeが呼び出されるってのを
見たことあるんだよなぁ...Page.Disposeも呼ばれてても不思議はない。

だれか実験してみてくれw
955nobodyさん:2008/11/23(日) 13:53:12 ID:???
>>954
言葉が書き足りなかったね
>IDisposeは、それが参照しているローカル変数が属するスコープから抜けた場合に、
>(将来的にGCによって)自動的に実行される
という意味なので、IDisposeについては意見は一致してると思う。

問題は

・スタティック変数やグローバル変数として保持しているインスタンスを、
ASP.NETが破棄するかどうか(IDisposetを呼び出すかどうか)

なわけだよね。
スタティック変数やグローバル変数はGCからみてルート中のルートだから
普通は破棄されないと思うんだがw、
確かにどんな動作してるから実験してみるしかないわなw

だれか頼むw
956nobodyさん:2008/11/23(日) 21:32:15 ID:???
>>955
お前の意見だと
GCはDisposeメソッドを(自動的に)呼び出す となるんだが
おれの意見は
GCはDisposeメソッドを呼び出さない だぞ

GCが呼び出すのはあくまでファイナライザで、正しく実装されていれば
ファイナライザ中でDisposeが呼び出されるであろうことが期待される。
お前のいうGCが自動的に呼び出すの意味がこれであるなら、
それは実装によるので保障されてないと言っている

Disposeを呼ぶのはあくまでそのインスタンスを生成した所有者の責任だ


いままでIDisposeって書いてたけど、ほんとはIDisposableだった
もしかして微妙に話がかみ合わないのはそのせいか?

実験したいがいまその環境がないんだよなぁ
957nobodyさん:2008/11/23(日) 22:03:55 ID:???
>>956
あー、ちょっとまってくれ、こっともC++/CLI前提で話をしていたかもしれない

>C#とC++/CLIを比較した場合のリソース管理の相違点は、
>C#のusingステートメントに相当する機能が、スコープに統合されている点です。
>たとえば、ローカル変数にDisposeパターンを実装したオブジェクトを記述した場合、
>そのローカル変数が属するスコープを抜ける時に、Disposeメソッドが呼び出されます。

ガーベッジコレクタの話ともごっちゃになってるな。
すまない、ちょっと調べてみる。
958nobodyさん:2008/11/24(月) 02:43:38 ID:???
ページの中にボタンを設け、抜粋ですが iTextSharp でPDFを作成し、表示しています。
今の状態ですと、ページが切り替わるのですが、これを別ウィンドウで表示することは
できるのでしょうか?

Protected Sub Bt_Print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_Print.Click

Response.ContentType = "application/pdf"

'PDFドキュメントを作成
Dim doc As Document = New Document(PageSize.A4)
PdfWriter.GetInstance(doc, Response.OutputStream)
               ・
               ・
               ・
doc.Close()
Response.End()

End Sub    
959nobodyさん:2008/11/24(月) 11:11:24 ID:???
>>958
自己レスですが、いったんファイルにして、
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2797&forum=7
の方法で解決しました。
960nobodyさん:2008/11/25(火) 17:01:44 ID:???
ASP.NETのMVCももうそろそろ正式版になりそうだけど
PHPでいうところのsmartyみたいなテンプレートエンジンはまだ一切出て無いんですかね?
961nobodyさん:2008/11/25(火) 20:03:06 ID:???
PHPでいうところのsmartyはそのままaspxじゃないの?
962nobodyさん:2008/11/25(火) 22:46:47 ID:tBm7rCDq
Visual Stuido 2008 Professional Edtionつかって、Vista Business上で開発しています。

まだ参考書に従ってサンプルのコードを打ち込んでるレベルです。
最初にWebフォームを作る際、「別のファイルにコードを書き込む」チェックボックスにチェックを入れて作ってるのに、
なぜかときどき、インラインコードになってしまうときがあります。

ページを新規作成してボタンを配置して、ダブルクリックしたらクリックイベントが.aspx.csの方に出来たのに、
いったんVisualStudioを閉じて、.slnファイルを起動して再度ボタンをダブルクリックしたら、
なぜか.aspxファイルのインラインにクリックイベントが出来てしまいました。

どういうときにこの現象が出るか、再現性がいまいちわからないのですが、
インライン←→コードビハインドが勝手に切り替わるのを防ぐにはどうしたらいいのでしょうか。

また、インライン←→コードビハインドの簡単な切り替え方がありましたら教えてください。
963nobodyさん:2008/11/26(水) 16:51:36 ID:???
SP1入れた?

あとaspxファイルの
<%@ Language="C#" Inherits="MyStuff.MyClass" %>
が無くて継承元のcsが見つからずにそんな状況になるとか。

想像だけど。
964nobodyさん:2008/11/27(木) 00:54:32 ID:???
現在、VS2005(ASP.net)にて通常のhtmlページ内にJavaScript
を色々と記述し勉強しているのですが、IDE上で実行を行うとブラウザが起動
しJavaScriptのコード等も問題無く起動するのですが、エラー一覧に次の様
なエラーがかなり出ています。
※ソースウィンドウからデザインウィンドウに切り替えるとエラーは、0になります。
エラー 1
検証 (XHTML 1.0 Transitional): 要素 'body' に対しては、 開始タグと終了グの間でテキストを使用できません。
※<body id="idBody">
エラー 2
  検証 (XHTML 1.0 Transitional): 要素 'body' に対して は、開始タグと終了グの間でテキストを使用できません。
エラー 3
検証 (XHTML 1.0 Transitional): 要素 'table' を要素 'p' の中に入れ子にすることはできません。
エラー 6
  検証 (XHTML 1.0 Transitional): この名前は大文字を含んでいます。ここで使用することはできません。
エラー 8
  検証 (XHTML 1.0 Transitional): Attribute 値は引用符で囲まなければなりません。

これって直さなくてはならない物なのでしょうか?エラーとはなっていますがどちらかというと警告レベルな気が
してなりません。また、ブラウザ上でJavaScriptコードは正常に動作しており実行時にブラウザの左下に警告メッセージも表示されていません。
965nobodyさん:2008/11/27(木) 00:57:14 ID:???
あと入力値チェックについて質問なんですけどWEBブラウザは、設定によりJavaScriptが禁止されている場合もありますよね?
という事は、幾らJavaScript側で入力値チェックをしても無駄な気がします。

皆さんは入力値チェックはサーバ or JavaScript どちらで行っていますか?
966962:2008/11/27(木) 01:17:41 ID:???
>>963
レスありがとうございます。

解決しました。
コントロールの属性から「runat="server"」が消えていました。
使ってたコントロールはHTMLツールボックスからドラッグしたボタンで、
「runat="server"」をソースに手動で(VS2005にあった「サーバーコントロールとして実行」がなくなったので)入れてたのですが、
たぶん、ctrl+zかなんかでその属性がない状態にもどったときにダブルクリックしたらインラインになっていたのだと思います。

お騒がせしました。
967 [―{}@{}@{}-] nobodyさん:2008/11/27(木) 09:57:14 ID:???
>>965
両方で
968nobodyさん:2008/11/27(木) 12:38:12 ID:???
>>964
XHTML 1.0 Transitionalという約束に従ってhtmlを記述しているにも関わらず、
(少なくともVSはそう思ってる)
その文法が間違っているんだから修正すべき。

曖昧な記述に対してブラウザが対応してくれてるだけで、
問題が発生するブラウザが存在しないとも限らないから。

>>965
JavaScriptでやるかやらないかは一長一短だけど、
JavaScriptではやらなくても良いけどサーバ側は絶対にやらなきゃ駄目
969964:2008/11/27(木) 23:37:28 ID:???
>>967
ええっっと。両方ですか。。。
サーバ側だけばっちし固めておけば良いと思ってたんですけど。

>>968
先ずはサーバ側のチェック処理を固めて時間に余裕が出来たら
JavaScriptでもチェック処理を行おうと思います。
970nobodyさん:2008/11/27(木) 23:54:14 ID:???
>969
まずサーバの方は必須なのでがっちり固める。
チェックのたびにいちいちリクエスト投げられると使い勝手が悪いような項目はJavaScriptで即座にチェックするという感じで。
971nobodyさん:2008/11/28(金) 00:08:25 ID:???
>サーバ側だけばっちし固めておけば良いと思ってたんですけど。

その判断は別に間違いではない。
ただ、javascriptが有効な場合にクライアント側でもチェックすることで、
ユーザビリティが向上したり、サーバの負荷を減らせることもある。

972969:2008/11/28(金) 00:17:46 ID:???
>>970 >>971
あざーす。参考にさせて頂きます。

あと一つ質問なのですがShilverLightって流行ってるんですか?
あと、VisualStudio2005ではShilverLightは使えないのでしょうか?

973nobodyさん:2008/11/28(金) 00:49:58 ID:???
馬鹿の臭いがする
974nobodyさん:2008/11/30(日) 23:26:29 ID:F+XZtgWf
ASP.NET2.0のログインコントロールとロールで認証を行おうとしています。
ルートは誰でも許可で、Adminというフォルダを作り、AdminフォルダのWeb.configで
<authorization>
<allow roles="admin"/>
<deny users="*" />
</authorization>
として、adminというロールが設定されているユーザ以外はAdminフォルダ拒否にしました。

ルートにログインコントロールを配置したフォームを作り、DestinationPageUrlに、
Adminフォルダのフォームを指定すると、
adminロールのユーザは指定したフォームが見れて、adminロール以外のロールが設定されているユーザは、
不許可のサーバーエラーになりました。

前置きが長くなりましたが、質問です。
このようなログインフォームで、指定ロールのユーザではないが"別のロールのユーザ"が指定された場合、
DestinationPageUrlに飛ばずに、ログイン画面での再入力を促す(ユーザ名やパスワードが間違ってた時のように)
ようにするにはどう設定するのでしょうか。
975nobodyさん:2008/12/02(火) 02:34:33 ID:???
iframeで表示されているページをJavaScriptで切り替えたいと
思い次のコードを記述しているのですがエラーが発生してしまいま
す。一体何が原因なのでしょうか?

【ソース】
//JavaScript
var strURL2 = "http://www.google.co.jp/webhp?sourceid=navclient&hl=ja&ie=UTF-8";
function ifr()
{
waku.location = strURL2;
}

<!-- リンクの文字-->
<A href="JavaScript:ifr()" id="idHrefFocus">あいうえお</A>

<!-- iFrame -->
<iframe src="http://dictionary.goo.ne.jp/" name="waku" id="id_iframe" width="100%" height="80%"
  style="z-index: 126; left: 24px; width: 98%; position:absolute; top: 544px; height: 38%"></iframe>

【エラー内容】
エラー:')'がありません。
コード:0
976nobodyさん:2008/12/04(木) 02:42:52 ID:???
ログインする時に別ウィンドウ開いてログインしたいけど何かヒントください
977nobodyさん:2008/12/04(木) 03:42:47 ID:???
ググレカス
978nobodyさん:2008/12/05(金) 20:47:30 ID:???
VWDでサイトを作成し、開発環境では動くようになりました。
これを、レンタルサーバーで公開するとき、DBはそのサーバーで作成するのでしょうか。
(今ある開発環境でのDBを持って行くことはできるのでしょうか)
979nobodyさん:2008/12/05(金) 23:16:04 ID:???
WebControlのmenuがあるページを作っていますが、NavigateUrlを使わずに
PostBackされた先でクリックされたmenuItemを判断してページに飛びたい
んです。

この場合、どのメニューがクリックされたかをどうやって知ればいいんでし
ょうか?
980nobodyさん:2008/12/06(土) 03:05:24 ID:???
>>978
DBがSQL Serverと勝手に解釈して話を進めるが
たいていの場合、DBまではレンタル鯖屋が作成する。
そのDBへ接続するためのIDとパスワードをもらってテーブルの作成以降を
ユーザが行う。テーブルなんかはManagementStudioとかでスクリプト経由で
テーブルを作り直すことになると思われる。

>>979
>WebControlのmenu
って何?
981MS:2008/12/06(土) 03:30:24 ID:???
>>980
System.Web.UI.WebControlsのMenuクラスだろ常考
素人は黙ってろ
982nobodyさん:2008/12/06(土) 10:42:32 ID:p1onuMwg
死ねばいいのに
983nobodyさん:2008/12/06(土) 15:54:23 ID:???
>>980
ありがとうございました。DBはMS-SQLを使っています。
トライアルというのがあったので、そこで実験してみます。
984nobodyさん:2008/12/07(日) 19:50:13 ID:MG3uyWjt
Visual studio 2008、SQL server 2005 Expressで開発してます。
ログインコントロール使ってログイン処理が出来ていたのに、マシンを再起動してからログインできなくなりました。
新たに作ったプロジェクトに新規でログインコントロール貼ってもだめです。
管理者用WebサイトでASP.NETWebサイト管理ツール画面を開いて、「セキュリティ」タブを開こうとすると、以下のエラーメッセージが出ます。

「選択されたデータ ストアに問題があります。無効なサーバー名、資格情報または十分なアクセス許可がないことが理由として
考えられます。ロール マネージャの機能が有効化されていないことも理由として考えられます。下のボタンをクリックして
ページにリダイレクトし、新しいデータ ストアを選択してください。
次のメッセージは問題を診断するのに役立つ可能性があります: SQL Server データベースに接続できません。 」
データストアの選択ボタンを押して、表示されたプロバイダを選んでテストにすると、
「データベースへの接続を確立できませんでした。
SQL Server データベースをまだ作成していない場合は、Web サイト管理ツールを終了し、
aspnet_regsql コマンドライン ユーティリティを使用してデータベースを作成および構成してから、
このプロバイダを設定するためにこのツールへ戻ってください。 」
と表示されます。

aspnet_regsql.exeやって完了してるし、SQL Server 2005のDBのテーブルににもアクセスできているのに、
ログインだけができません。
どうやったらログインできるんでしょうか。
985nobodyさん:2008/12/07(日) 19:52:13 ID:???
ググレカス
986983
「原因はわからないけどUser Instanceをfalseにしたら動いた」という記事があったのでfalseにしたら、
IDE上で接続テストは成功し、テーブルの中身も見れますが、
F5でデバッグ開始するとやはりログインできません。
また、VisualStudioを終了して、再度プロジェクトを開くと、User InstanceがTrueに勝手に戻ってしまいました。

OSを再起動するまでは普通に動いていましたが、原因わかる方いましたら教えてください。