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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

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

Q&A

解決済

2回答

10101閲覧

ASP.net WebMethod内でセッション変数に格納

Qoo

総合スコア1249

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

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

0グッド

0クリップ

投稿2017/01/24 12:24

ASP.net(IIS7 , FW4.5 , WINDOWS10 , c# )でSNS連携処理を作成しております。
JQueryから下記のようにWebMethodを呼び出し、DBへの登録処理を書き、登録自体は問題なくできています。

登録後、登録情報をもとにセッション変数に値を格納したいのですが、
メソッド内でセッション変数への登録、コントロールの非表示が利用できません。

EnableSession =trueでセッションが利用できるようになると思ったのですができず、
static を外すとメソッドのエラーは消えましたが、メソッド自体が実行されなくなってしまいました。

ご指摘、ご助言頂けるとありがたいです。宜しくお願い致します。

.aspx側

$.ajax({ type: "POST", url: "index.aspx/infoFB", data: '{ idFB: "' + response.id + '", name : "' + response.name + '" }', contentType: "application/json; charset=utf-8", dataType: "json", success: function (data) { console.log(data); }, failure: function (response) { alert(response.d); } });
[WebMethod(EnableSession =true)] public static string infoFB(string idFB, string name) { //DB接続 try { //DB登録処理 //DB登録後、ログイン名をセッション変数に格納したいがメソッドエラーになる Session["login_name"] = name; //ボタンコントロールも非表示にしたいがこのメソッドもエラーになる LoginButton.Visible = false; } catch (MySqlException ex) { Debug.WriteLine(ex.ErrorCode.ToString()); } finally { //DB Close } return "OK"; }

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

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

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

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

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

yuba

2017/01/24 15:15

infoFBを収めているクラスはWebServiceを継承していますか?
Qoo

2017/01/24 15:34

いえ、System.Web.UI.Pageのみになります。
退会済みユーザー

退会済みユーザー

2017/01/25 00:25

jQuery.ajax で要求をかけた時にセッションクッキーは要求ヘッダに含まれていますか? Fiddler などのキャプチャツールを使って調べてください。
guest

回答2

0

ベストアンサー

今さらながらですが、コードをよく読んでみました。

Web サービスのメソッドは .asmx の中に配置したのではなく、.aspx ページの静的メソッドとして実装したようですね。

そして、問題はそのメソッドの中で、

(1) Session["login_name"] = name; とすると「静的でないフィールド、メソッド、またはプロパティ 'System.Web.UI.Page.Session.get' で、オブジェクト参照が必要です」というエラーになる、そして、

(2) LoginButton.Visible = false; とすると、同様に、「静的でないフィールド、メソッド、またはプロパティ '...aspx.LoginButton' で、オブジェクト参照が必要です」となってコンパイルも通らないという状況と理解しました。

その理解で正しいとすると、(1) は HttpContext.Current.Session で HttpSessionState オブジェクトを取得し、それを操作することで対応できます。例えば:

HttpSessionState session = HttpContext.Current.Session; session["login_name"] = name;

(2) は Web サービスのメソッドの中では何ともならないです。(jQuery ajax で Web サービスのメソッドを呼んでいるだけで、ポストバックして再描画しているわけではないので)

クライアントスクリプトで何とかするほか方法はなさそです。例えば、jQuery ajax のコードの success オプションに設定したコールバックの中で、当該ボタンのスタイルを display: none に設定するスクリプトを追加してはいかがでしょう。

#今回の話とはあまり関係ないことですが、.aspx ページの静的メソッドとして Web サービスメソッドを実装すると、WebMethod 属性の EnableSession プロパティを true に設定しなくてもセッションは使えます。

投稿2017/01/25 05:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Qoo

2017/01/25 05:35

ありがとうございます! 教えて頂いた通りでsession変数に入れることができました! (2) についてはクライアントスクリプトでなんとかなりそうです。 悩んでいたので助かりました! きの
guest

0

https://msdn.microsoft.com/ja-jp/library/system.web.services.webmethodattribute.enablesession(v=vs.110).aspx
備考のところ、日本語が完全に崩壊していますがマウス当てて原語を読むと、「WebServiceを継承すべし」とあります。

投稿2017/01/24 15:38

yuba

総合スコア5568

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問