Публикация Javascript в VB.Сетевая страница несколько раз

#javascript #jquery #vb.net

#javascript #jquery #vb.net

Вопрос:

Приветствую,

При нажатии кнопки javascript я использую jquery для публикации на URL:

 $(".optionClick").click(function () {
      var caseOption = $(this).attr('title');
      $.post("../tracking/RecordClick.aspx?page=galleryamp;item="   caseOption);
});
  

На вызываемой странице я использую следующее vb.net код для извлечения переменных querystring и записи их в базу данных:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not Request.QueryString("page") Is Nothing Then
        Dim trackingPage As String = Request.QueryString("page")
        Dim trackingIP As String = Request.UserHostAddress
        Dim trackingItem As String = Request.QueryString("item")
        Dim trackingDate As String = Date.Now().ToString("G")

        Try
            Dim conString As String
            conString = ConfigurationManager.ConnectionStrings("SSFDBConnectionString").ConnectionString
            Dim sqlCon As New SqlConnection(conString)
            Dim cmd As New SqlCommand


            Select Case trackingPage

                Case "gallery"

                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = "INSERT INTO UserTrackGallery VALUES ('" amp; trackingIP amp; "', '" amp; trackingItem amp; "', '" amp; trackingDate amp; "')"
                    cmd.Connection = sqlCon

                    If sqlCon.State = ConnectionState.Closed Then
                        sqlCon.Open()
                    End If

                    cmd.ExecuteNonQuery()

                    If sqlCon.State = ConnectionState.Open Then
                        sqlCon.Close()
                    End If

                Case "products"

                Case "search"

            End Select


        Catch ex As Exception

        End Try

        Response.Close()
    End If

End Sub
  

В локальной разработке это отлично работает для меня, записывая одну запись в базу данных за нажатие кнопки. Однако на сервере каждая публикация генерирует от 1 до 7 записей в базу данных.

Я искал решение в течение нескольких дней безрезультатно. Любая помощь приветствуется!

——————————Обновить———————————

Я попытался упростить процесс, создав VB.Чистая страница только с одной кнопкой:

 <%@ Page Language="VB" AutoEventWireup="false" CodeFile="javascript.aspx.vb" Inherits="gallery_javascript" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="../Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
           $.ajaxSetup({ async: false });
           $(".optionClick").click(function () {
                $.post("../tracking/RecordClick.aspx?page=galleryamp;type=clickamp;item=XYZ");
           });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="Button1" type="button" class="optionClick" value="button" />
    </div>
    </form>
</body>
</html>
  

Но проблема сохраняется. Firebug сообщает «Прервано», и страница вызывается несколько раз. Я также пробовал этот javascript:

 $(document).ready(function () {
     $.ajaxSetup({ url: '../tracking/RecordClick.aspx' });
     $(".optionClick").click(function () {
           $.ajax({ data: 'page=galleryamp;type=clickamp;item=XYZ' });
     });
});
  

Пробовал это также:

 url = "../tracking/RecordClick.aspx?page=galleryamp;type=clickamp;item=XYZ";
if (window.XMLHttpRequest) { // Non-IE browsers
     req = new XMLHttpRequest();
     try {
          req.open("POST", url, false);
     } catch (e) {
          alert(e);
     }
     req.send(null);
} else if (window.ActiveXObject) { // IE
     req = new ActiveXObject("Microsoft.XMLHTTP");
     if (req) {
          req.open("POST", url, false);
          req.send();
     }
}
  

Каждый из приведенных выше блоков javascript работал локально, как и предполагалось, но произошел одинаковый сбой с несколькими записями в базу данных и статусом Firebug «Прервано».

Если я вызываю URL querystring напрямую через браузер, все работает так, как ожидалось.

Может ли это быть связано с какой-то задержкой, поскольку она работает локально? Спасибо за помощь на данный момент!

(Редактировать) Также пробовал использовать полный URL-адрес path в приведенном выше коде — никаких улучшений.

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

1. Находится ли это на общедоступном сайте, где мы можем видеть запущенный код?

2. можете ли вы предоставить разметку вашей кнопки, например <тип ввода =»button» class=»optionClick» /> Есть ли у вас другой элемент с таким классом?

3. Да, несколько элементов используют этот же класс, который, как я изначально думал, может быть проблемой. Для тестирования я использовал идентификатор другого элемента и выдал тот же результат. Извините, я не использую реальную кнопку, но действую как кнопка изображения:

4. <a href=»../images/cases/20100506-160528-BCX-002.jpg » class=»optionClick» rel=»lytebox[cases]» title=»BCX-CVX»><img src=»../images/cases/20100506-160538-BCX-002-thumb.jpg » width =»100″ height =»77″ alt =»../images/cases/20100506-160538-BCX-002-thumb.jpg » /></a>

5. Sam — в настоящее время не является общедоступным. Извините.

Ответ №1:

Я нашел решение своей проблемы. Похоже, что более поздние версии .Net предотвращают HTTP POST вызовы, но это разрешено для localhost (вот почему он отлично работал локально). HttpWatch и Firebug оба показали подключение к странице .aspx, но ответа не вернулось. Похоже, что множественные вызовы были попытками повтора для получения ответа.

Моим решением было создать веб-сервис:

 Option Strict On
Imports System.Data.SqlClient
Imports System.Data
Imports System
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Web.HttpContext
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://mywebsite.com/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class RecordClick
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function RecordClick() As String

        Dim trackingPage As String = ""
        Dim trackingIP As String = ""
        Dim trackingType As String = ""
        Dim trackingItem As String = ""
        Dim trackingDate As String = ""


        With HttpContext.Current
            trackingPage = .Request.Params.Item(0)
            trackingIP = .Request.UserHostAddress
            trackingType = .Request.Params.Item(1)
            trackingItem = .Request.Params.Item(2)
            trackingDate = Date.Now().ToString("G")
        End With    

            Dim conString As String
            conString = ConfigurationManager.ConnectionStrings("SSFDBConnectionString").ConnectionString
            Dim sqlCon As New SqlConnection(conString)
            Dim cmd As New SqlCommand
            cmd.Connection = sqlCon

            cmd.CommandType = CommandType.StoredProcedure
            cmd.CommandText = "spInsertRecordClick"

            cmd.Parameters.Add("@IPAddress", SqlDbType.NVarChar, 50)
            cmd.Parameters("@IPAddress").Direction = ParameterDirection.Input
            If trackingIP = "" Then
                cmd.Parameters("@IPAddress").Value = DBNull.Value
            Else
                cmd.Parameters("@IPAddress").Value = trackingIP
            End If

            cmd.Parameters.Add("@CaseOption", SqlDbType.NVarChar, 50)
            cmd.Parameters("@CaseOption").Direction = ParameterDirection.Input
            If trackingItem = "" Then
                cmd.Parameters("@CaseOption").Value = DBNull.Value
            Else
                cmd.Parameters("@CaseOption").Value = trackingItem
            End If

            cmd.Parameters.Add("@TimeDate", SqlDbType.DateTime)
            cmd.Parameters("@TimeDate").Direction = ParameterDirection.Input
            If trackingDate = "" Then
                cmd.Parameters("@TimeDate").Value = DBNull.Value
            Else
                cmd.Parameters("@TimeDate").Value = trackingDate
            End If

            cmd.Parameters.Add("@ViewType", SqlDbType.NChar, 10)
            cmd.Parameters("@ViewType").Direction = ParameterDirection.Input
            If trackingType = "" Then
                cmd.Parameters("@ViewType").Value = DBNull.Value
            Else
                cmd.Parameters("@ViewType").Value = trackingType
            End If

            cmd.Parameters.Add("@Page", SqlDbType.NVarChar, 50)
            cmd.Parameters("@Page").Direction = ParameterDirection.Input
            If trackingPage = "" Then
                cmd.Parameters("@Page").Value = DBNull.Value
            Else
                cmd.Parameters("@Page").Value = trackingPage
            End If

            Try
                If sqlCon.State = ConnectionState.Closed Then
                    sqlCon.Open()
                End If

                cmd.ExecuteNonQuery()


            Catch ex As Exception

            Finally
                If sqlCon.State = ConnectionState.Open Then
                    sqlCon.Close()
                End If

            End Try

            If sqlCon.State = ConnectionState.Open Then
                sqlCon.Close()
            End If

        Return "Success"

    End Function

End Class
  

Это javascript, который я использовал для вызова веб-службы:

  $.ajax({
        type: "POST",
        url: "../tracking/RecordClick.asmx/RecordClick",
        data: "page="   DMOriginatingPage   "amp;type="   DMType   "amp;item="   DMtitle
    });
  

Мне пришлось добавить в систему следующее.веб-раздел web.config:

     <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>
  

Теперь это работает идеально. Я не очень опытен в этой области, поэтому, вероятно, есть лучшее решение для того, что я пытаюсь сделать. Однако, возможно, это поможет кому-то еще — мне потребовалось две недели, чтобы разобраться в этом. 🙂

Ответ №2:

Я бы предложил отследить проблему.

1) Используйте Firefox Firebug, откройте вкладку NET и посмотрите, сколько запросов отправлено.

2) Вставьте свой AJAX URL в адресную строку вашего браузера и посмотрите, что происходит на сервере. Таким образом, вы уверены, что выполнен только один запрос.

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

1. Отличная идея. Спасибо. Вариант 1 показывает некоторые прерванные состояния, за которыми следуют 2 или 3 ответа «200 OK». Похоже, моя проблема на стороне javascript, но я не могу определить, что не так. Я попробовал несколько других методов публикации, которые пока не помогли.

2. Спасибо Diodeus. Это привело меня к моему решению. Причиной этой проблемы был какой-то другой Javascript на моей странице, и благодаря Firebug я в конечном итоге смог это исправить. В мой арсенал устранения неполадок добавлен новый инструмент. 🙂 Спасибо!

3. Хорошо, я думал, что у меня это получилось, но я ошибался. Существует та же проблема. Firebug выдает ответ «200 OK» при локальной работе, но как только я попадаю на сервер, я получаю ответ «Прервано». VB. Функциональность Net по-прежнему вызывается и записывается в базу данных, но проблема в том, что она вызывается много раз.

4. Я обновил свой первоначальный пост, чтобы отразить дополнительные усилия по устранению неполадок.

Ответ №3:

Вы пробовали использовать полный путь от корня сайта в вызове post … вместо использования «../»?

Подозрительный код:

 $(".optionClick").click(function () {
                $.post("../tracking/RecordClick.aspx?page=galleryamp;type=clickamp;item=XYZ");
           });
  

попробуйте удалить «..» и заменить его фактическим путем…Я подозреваю, что это может быть причиной вашей проблемы.

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

1. Да, я это сделал. Извините, я хотел упомянуть это в своем обновлении. Я нашел другой пост, который рекомендовал это — был обнадеживающим, но это не помогло.

2. @bham3dman хммм … похоже, проблема на стороне клиента … извините, но на данный момент у меня для вас больше ничего нет.