如何在asmx方法asp.net中获取会话值

问题描述

如何获取Web方法的会话值。我已经尝试过,但是它给了我对象引用,而不是设置为object的实例。任何人都知道这个问题。我想在我的第二个方法中获得第一个方法的会话值。 我该怎么做 。我在getid方法中从我的ajax函数到asmx页面获得价值。但我希望它以第二种方法作为参数,以便我可以执行搜索过程

  The full code is here 
   **javascript code**
    <script type="text/javascript">
       $(document).ready(function () {
        $('#btn').on('click',function () {
        
            $.ajax({
                url: 'EmployeeWebService.asmx/GetEmployees',data: { id: '2'},//this is id i want to get
                dataType: "json",method: 'post',success: function (data) {

                  


                },error: function (err) {
                    alert(err);
                }

            });

           
        });
    });
          </script>
        <script type="text/javascript">
            $(document).ready(function () {
                $('#btn').on('click',function () {

                $('#datatables').DataTable({

                columns: [
                    { 'data': 'Id' },{ 'data': 'FirstName' },{ 'data': 'LastName' },{ 'data': 'Gender' },{ 'data': 'JobTitle' },{
                            data: "TotalQuestions",render: function 
                (data,type,row) {
                                return '<button type="button" data-id="  ' 
                + row.Gender + '  " class="get_tsk" style="background- 
                  color:steelblue;color:white;border:none;">view</button> '
                            }
                        },],bServerSide: true,sAjaxSource: 'EmployeeWebService.asmx/GetEmployees',sServerMethod:'post'
          
                });



                });
            });

       </script>
   **first Method**

第一种方法 字符串nameofid;

    [WebMethod(EnableSession = true)]
    public void GetId(string id)
    {
       
         Session["nameofid"] = id;

    }
  **Second Method** 

    public void GetEmployees(string id,int idisplayLength,int 
     idisplayStart,int 
      iSortCol_0,string sSortDir_0,string sSearch)
     {
        int displayLength = idisplayLength;
        int displayStart = idisplayStart;
        int sortCol = iSortCol_0;
        string sortDir = sSortDir_0;
        string search = sSearch;

        int filteredRows = 0;

        string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
        //  
        List<Employee> listemployee = new List<Employee>();
        using (sqlConnection con = new sqlConnection(cs))
        {

            sqlCommand cmd = new sqlCommand("spGetEmployees",con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Id",sqlDbType.NVarChar,50).Value =id;

            sqlParameter paramdisplayLength = new sqlParameter()
            {
                ParameterName = "@displayLength",Value = displayLength
            };
            cmd.Parameters.Add(paramdisplayLength);

            sqlParameter paramdisplayStart = new sqlParameter()
            {
                ParameterName = "@displayStart",Value = displayStart
            };
            cmd.Parameters.Add(paramdisplayStart);

            sqlParameter paramSortCol = new sqlParameter()
            {
                ParameterName = "@SortCol",Value = sortCol
            };
            cmd.Parameters.Add(paramSortCol);

            sqlParameter paramSortDir = new sqlParameter()
            {
                ParameterName = "@SortDir",Value = sortDir
            };
            cmd.Parameters.Add(paramSortDir);

            sqlParameter paramSearchString = new sqlParameter()
            {
                ParameterName = "@Search",Value = string.IsNullOrEmpty(search) ? null : search
            };
            cmd.Parameters.Add(paramSearchString);

            con.open();
            sqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                filteredRows = Convert.ToInt32(rdr["TotalCount"]);
                Employee employee = new Employee();
                employee.Id = Convert.ToInt32(rdr["Id"]);
                employee.FirstName = rdr["FirstName"].ToString();
                employee.LastName = rdr["LastName"].ToString();
                employee.Gender = rdr["Gender"].ToString();
                employee.JobTitle = rdr["JobTitle"].ToString();
                listemployee.Add(employee);
            }
        }

        var result = new
        {
            iTotalRecords = GetEmployeetotalCount(),iTotaldisplayRecords = filteredRows,aaData = listemployee
        };

        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(result));
    }
    private int GetEmployeetotalCount()
    {
        int totalEmployees = 0;
        string cs = 
          ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
        using (sqlConnection con = new sqlConnection(cs))
        {
            sqlCommand cmd = new sqlCommand("Select count(*) from 
         tblEmployees",con);
            con.open();
            totalEmployees = (int)cmd.ExecuteScalar();
        }
        return totalEmployees;

    }

}

解决方法

@fazal-检查下面的屏幕截图,然后按照步骤操作。

我希望这对您有帮助。

Step 1

Step 2

Step 3

,
  1. 在以下行添加路由配置文件:

    routes.IgnoreRoute(“ { x}”,新的{x = @“。 .asmx(/.*)?”});

  2. 添加WebService文件:

     [WebMethod(EnableSession = true)]
     [ScriptMethod]
     public string HelloWorld()
     {
         if (HttpContext.Current.Session["SessionDetail"] != null)
         {
             string _SessionData = Convert.ToString(HttpContext.Current.Session["SessionDetail"]);
         }
    
         return "Hello World";
     }
    
  3. 分配会话值:

         public ActionResult Index()
         {
             Session["SessionDetail"] = "Value for Session";
             return View();
         }
    
,

好吧,首先,您使用这个:

Session["nameofid"] = id;

然后是这个

HttpContext.Current.Session["nameofid"].ToString();

下一个问题是如何调用这些方法?如果您使用jQuery.ajax?

请记住它们是异步调用。如果您调用set,然后在同一代码存根中调用第二个例程,则该例程通常会失败,因为此类调用是异步的。

您“可以”考虑在ajax调用中使用async = false,但是浏览器(和jQuery)现在警告不允许或不支持非异步调用。

这是什么意思?请注意,如果要通过Web方法调用SET值,则需要将随后的代码拆分到单独的例程中。

我们曾经做过:

           function ShowPdf(pID) {

               //  set/save the  id
               $.ajax({
                   type: "POST",async: false,url: 'ProjectUpload.aspx/SetChoice',data: '{strSess:"ProofID",strValue:' + pID + '}',contentType: "application/json",datatype: "json"
               });
               // MORE code  here - and MAYBE some code that calls or MIGHT
               // use the value based on the ABOVE web method call
               // but we CAN'T use async: false anymore!
               // so we CAN NOT write code folling here that needs or 
               // assumes the above call is finished - this code does not
               // wait.

因此,上面的代码变为:

           function ShowPdf(pID) {

               //  set/save the  id
               $.ajax({
                   type: "POST",success: ShowPdf2,<- AFTER code  now is moved to this rouine
                   url: 'ProjectUpload.aspx/SetChoice',datatype: "json"
               });
           }
           function ShowPdf2() {

               // split out due to we have to wait async
               // for web call to complete. This code ONLY runs WHEN
              // the above web call is 100% done. Even if web server is slow today!
               // MUST  set session() ProofID before calling this routine

               // show a dialog  in this page pdfdiv
                var mydiv = $('#pdfdiv');

                mydiv.dialog({
                 autoOpen: false,modal: true,title: 'Proofing: ',width: '100%',position: {
                    my: "center top",at: "center top+80"
                     },close: myempty,dialogClass: 'dialog-no-close'
                    });
                    mydiv.load('../PDF1.aspx');
                    // Open the dialog
                    mydiv.dialog('open');
               // }
           }

因此,上述代码失败,因为在进行session()设置ajax调用之前,以下网络调用将开始运行。

设置async:false DID可以很好地工作,但是在浏览器调试中,我们看到了警告:jQuery(或Web浏览器)很快将不再支持async:false。因此,您将在异步调用完成后连接一个例程以运行,然后移出该例程的后续代码,这样,随后的代码就被jQuery移出并调用了(成功:事件)。

因此,尚不清楚您的代码如何/何时/何地调用第一个Web方法,但是如果有任何代码调用FOLLOWS来检查/查看/抓取/获取/查看从第二个Web返回的session()值方法?您必须处理异步问题。

并取决于您的导入(用于c#人员),那么如果需要在Web方法中使用session()之前包括名称空间。

我发现我必须使用它:

    HttpContext.Current.Session(strSess) = strValue

因此,我将在两个Web方法中使用相同的名称空间引用-完全不清楚为什么您在一个代码存根中保留了名称空间,而在另一个存根中保留了名称空间。

如前所述,还不清楚您的js如何测试/获取session()值,但是如前所述,第一个设置session()的网络调用不会等待,有时您会发现当您调用第二个获取session()的例程,第一个例程可能尚未完成(因为调用是异步的)。