开发者

Javascript posting to VB.Net page multiple times

Greetings,

Upon a javascript button click, I'm using jquery to post to a url:

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

On the page being called, I'm using the following vb.net code to retrieve the querystring variables and write them to a database:

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 ('" & trackingIP & "', '" & trackingItem & "', '" & trackingDate & "')"
                    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

In local development, this works perfectly for me recording one database write per button click. On the server however, each post generates anywhere from 1 to 7 database writes.

I've been searching for a solution for a couple of days to no avail. Any help is greatly appreciated!

------------------------------Update--------------------------------

I tried to simplify the process by creating a VB.Net page with only a single button:

<%@ 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=gallery&type=click&item=XYZ");
           });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="Button1" type="button" class="optionClick" value="button" />
    </div>
    </form>
</body>
</html>

But the problem persists. Firebug reports "Aborted" and the page is called multiple times. I also tried this javascript:

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

Tried this also:

url = "../tracking/RecordClick.aspx?page=gallery&type=click&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();
     }
}

Each of the javascript blocks above worked locally as intended but failed in the same manner with multiple DB writes and Firebug "Aborted" status.

If I call the url+querystring directly via the browser, everything works as expected.

Could this be related to a delay of some sort since it works locally? Thanks for the help thus far!

(Edit) Also tried using the full path url in the code above - no improvement.


I found a solution to my problem. It appears that the more recent versions of .Net prevent HTTP POST calls, but this is allowed for localhost (which is why it worked perfectly locally). HTTPWatch and Firebug both showed the .aspx page connection but no response returned. It appears as though the multiple calls were retry attempts to receive a response.

My solution was to create a web service:

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

This is the javascript I used to call the web service:

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

I had to add the following to the system.web section of the web.config:

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

It works perfectly now. I'm not very experienced in this area so there's probably a better solution for what I'm trying to do. However, maybe this will help someone else - took me two weeks to figure this out. :)


I would suggest tracing the problem.

1) Use Firefox + Firebug, open the NET tab and watch how many requests are sent.

2) Paste your AJAX URL in your browser's address bar and see what happens on the server. This way you are sure only one request is made.


Have you tried using the full path from the root of the site in the post call...instead of using the "../"?

Suspect code:

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

try removing the ".." and replacing it with the actual path...I am suspicious that that could be causing your problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜