質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

512閲覧

Webアプリケーションのソースに変更が無いのに挙動が変わる

kariya

総合スコア75

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/05/27 08:40

概要

非常にざっくりとした表題で申し訳ないのですが、参考となる情報があればご提供いただきたい次第です。

稼働して間もないWebアプリケーションです。
数日間は想定通りの正常な挙動をしめすのですが、
ある日から突然、ソースを一切変更していないのにも関わらず、
異常な挙動となってしまう部分があります。

挙動の詳細

正常な挙動

  • ログインユーザーには「ゲスト」と「一般」、「特権」の3種類権限がある。
  • ログイン時にユーザーの権限を取得、セッション変数に保持する。
  • ゲスト以外がログインした場合には、「登録ボタン」が表示される
  • ゲストがログインした場合にはとある画面での「登録ボタン」が非表示となる。(こちらが初期状態)

異常な挙動

  • ゲスト以外でログインしているにも関わらず、「登録ボタン」が表示されない。

環境

Webサーバ

  • Windows Server 2012 R2 Standard
  • IIS8.5
  • .NetFrameWork 4.5
  • ASP.NET

ロジックの詳細

hoge.aspx ファイルに以下のような記述をしております(抜粋)

<div> <% If isVisible = True Then %> <asp:Button ID="btnTouroku" runat="server" Text="登録" /> <% End If %> </div>

hoge.aspx.vb ファイルには以下のような記述をしております(抜粋)

Protected Shared isVisible As Boolean = True '他の処理 ・・・ Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' 画面遷移してきた場合にのみ表示/非表示の切り替えロジックを実行します If Not IsPostBack Then '1:ゲスト 2:一般 3:特権 としております。 'Session(USER_KENGENN)には、ログイン認証時に取得したユーザーの権限(1/2/3)をセットしている If CInt(Session(USER_KENGENN)) <= 1 Then isVisible = False End If '他の処理 ・・・ Else '他の処理 ・・・ End If End Sub

変数isVisibleを使用している箇所は上記抜粋の部分のみです。

また、他画面においてゲスト以外が利用できる機能が有効となっているため、
Session(USER_KENGENN)の値に1が設定されていることは有りえません。

そもそも、コンパイル後の状態で、当日から数日間は正常な挙動が確認できるのに、
数日経過後から挙動がおかしくなってしまうため、コーディングの問題ではないだろうと思っております。


非常にふわっとした質問で恐縮なのですが、どのように調査し、解決へのアプローチをすればよいかわからず、
途方に暮れている状態です。
なにか参考となるような情報や、「このキーワードでググってみれば」のようなアドバイスでも構いませんので、
ご意見をいただければと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/27 08:55

認証方式は何なのですか? 何故、isVisible が Shared なのですか? それは有り得ないような気がしますけど。
kariya

2019/05/27 09:16

質問に対する回答としてあっているのかどうかはわかりませんが、 認証方法はDB上のユーザーマスタを参照しています。 ユーザーの権限についてもDBの値より取得します。 なぜ Shared なのか・・・ そのあたりの理解が不十分でしたので、今一度調べてみました。 確かに用途としては不要、と言いますか、おかしいですね。 それどころか他のフォームで同じ名称の変数を宣言していた場合に、値が置き換わる可能性があるということであれば、おそらくはそれが原因かと思います。
退会済みユーザー

退会済みユーザー

2019/05/27 09:42

認証方式は独自実装のようですが、ASP.NET に標準で備わっている認証方式(ASP.NET Identity など)を使わない理由があるのですか? もし知らないで独自実装しているなら、今すぐ標準の認証方式に変えましょう。それが最も簡単にあなたがやりたいことを実現できる方法です。
guest

回答1

0

ベストアンサー

全体が見えないので断定的なことは言えませんが、上のコメントで書いたように、isVisible が Shared になっているところが問題ではないかと思います。

例えば、ユーザー A(ゲスト)とユーザー B(一般または特権)が同時にアクセスしてきた場合、isVisible が Shared(A と B がシェアして使う)なので、A が isVisible を False に書き換えた直後に B がアクセスした結果、

ゲスト以外でログインしているにも関わらず、「登録ボタン」が表示されない。

・・・となるというようなことではないかと想像しています。(下の**【追記】**参照)

なので、isVisible を使わないようにして検証してみてはいかがですか?

具体的には、hoge.aspx ファイルは単純に以下のようにして、

<asp:Button ID="btnTouroku" runat="server" Text="登録" />

hoge.aspx.vb ファイルでは isVisible は使わないで、以下のように Button の Visible プロパティに直接 True, False を設定して試してみてはいかがですか?

If CInt(Session(USER_KENGENN)) <= 1 Then btnTouroku.Visible = False Else btnTouroku.Visible = True End If

本題とは関係ないですが、Session(USER_KENGENN) を評価する前に Nothing でないことを確認した方がよさそうです。

あと、これもコメントに述べたことですが、認証方式は独自実装のようですが、どうしても独自認証にしなければならない理由がなければ、ASP.NET に標準で備わっている認証方式(ASP.NET Identity など)を使用することをお勧めします。

【追記】

ASP.NET Web アプリは、ユーザーから要求があるたびにスレッドプールからスレッドを取得してきてその要求を処理します。つまり、複数のユーザーから同時に要求を受けるとユーザー毎に複数のスレッドを使って要求を処理をするというマルチスレッドアプリです。なので、ASP.NET Web アプリで Shared 使うと上に書いたような問題が起こり得ます。使わないようにしましょう。

投稿2019/05/28 00:40

編集2019/05/28 05:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kariya

2019/05/28 07:29

丁寧にご説明いただきありがとうございます。 Shared変数にしてしまうと、完全に意図しない動きをするということが よく理解できました。 Sharedを外すことでひとまずは意図した動きをするようになったことを確認できました。 ログイン認証についても、主題ではなかったにせよ、ご助言ありがとうございます。 標準の認証機能を使うように変更してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問