как получить значение сеанса в методе asmx asp.net

#c# #asp.net

#c# #asp.net

Вопрос:

Как я могу получить значение сеанса для веб — метода. Я пробовал, но это дает мне ссылку на объект, не установленную как экземпляр object . Любой орган знает об этой проблеме .я хочу получить значение сеанса первого метода в моем втором методе . как я могу это сделать. я получаю значение из моей ajax-функции на мою страницу asmx в методе getid . но я хочу, чтобы оно было в моем втором методе в качестве параметра, чтобы я мог выполнять процесс поиска

   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**
  

Первый способ
идентификатор имени строки;

     [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;

    }
  

}

Ответ №1:

  1. Добавьте файл конфигурации маршрута ниже строки :

    маршруты.IgnoreRoute(«{x}», new { x = @»..asmx(/.*)?» });

  2. Добавить файл веб-сервиса :

      [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();
         }
      

Комментарии:

1. Поделитесь своим полным кодом, чтобы я мог проверить и вернуться к вам.

2. Проверьте мой другой ответ на сообщение

Ответ №2:

Ну, во-первых, вы используете это:

 Session["nameofid"] = id;
  

и затем это:

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

Следующий вопрос заключается в том, как вы вызываете эти методы? Если вы используете, скажем, jQuery.ajax?

Помните, что это асинхронные вызовы. Если вы вызываете set, а затем в той же заглушке кода вызываете 2-ю процедуру, она часто завершается неудачей, поскольку такие вызовы являются асинхронными.

Вы могли бы рассмотреть возможность использования async = false в вызовах ajax, но браузеры (и jQuery) теперь предупреждают, что неасинхронные вызовы не будут разрешены или поддерживаться.

Что это значит? Будьте осторожны, и если вы выполняете вызов веб-метода для УСТАНОВКИ значения, то вам нужно разделить следующий код на отдельную процедуру.

раньше мы делали:

            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',
                   data: '{strSess:"ProofID", strValue:'   pID   '}',
                   contentType: "application/json",
                   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() set ajax.

Установка async: false работала хорошо, но при отладке браузера мы увидели предупреждения о том, что async: false скоро не будет поддерживаться в jQuery (или веб-браузерах). Итак, вы подключаете процедуру для запуска при выполнении асинхронного вызова и переносите следующий код в эту процедуру, таким образом, следующий код был удален и вызван jQuery (success: event).

Итак, неясно, как / когда / где ваш код вызывает первый веб-метод, но если последует какой-либо вызов кода для проверки / просмотра / захвата / получения / просмотра значения session(), которое будет возвращено из 2-го веб-метода? Вам приходится иметь дело с проблемой асинхронности.

и в зависимости от вашего импорта (с использованием для пользователей c #), тогда, если вам нужно включить пространство имен перед использованием session() в веб-методе.

Я считаю, что должен использовать это:

     HttpContext.Current.Session(strSess) = strValue
  

Итак, я бы использовал одну и ту же ссылку на пространство имен в обоих ваших веб-методах — совсем НЕ понятно, почему вы не указали пространство имен в одной заглушке кода, но поместили его в другую.

Как уже отмечалось, также неясно, как ваш js тестирует / получает значение session(), но, как уже отмечалось, первый веб-вызов для установки session() НЕ будет ждать, и иногда вы обнаруживаете, что при вызове 2-й процедуры для получения session() первая процедура, возможно, еще не завершена (поскольку вызовы асинхронны).

Ответ №3:

Проверьте мой скриншот ниже и следуйте инструкциям:

Шаг 1

Шаг 2

Шаг 3

Комментарии:

1. Пожалуйста, поделитесь своим кодом в виде текста, а не изображения. Это улучшило бы ваш ответ.

2. Можете ли вы проверить мой ответ

3. я использую функции jquery ajax !.