ho fatto delle prove, come questa, per esempio:

pagina:
codice:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="semplice_ajax_1.aspx.vb" Inherits="CorsoApogeo_ajax_semplice_ajax_semplice_ajax_1" %>

<!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>Pagina senza titolo</title>
    <link href="../../../stili/Styles.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="../../../js/ajax.js"></script>
    <script language="javascript" type="text/javascript">
// <!CDATA[

//non utilizzo la funzione crea_parametri
function a1_onclick(v)
{
    var parametri = $("__EVENTTARGET").name + "=" + v.id
            + "&" + $("__EVENTARGUMENT").name + "=" + ""
            + "&" + $("__VIEWSTATE").name + "=" + encodeURIComponent($("__VIEWSTATE").value)
            + "&" + $("__EVENTVALIDATION").name + "=" + encodeURIComponent($("__EVENTVALIDATION").value);
    
    parametri += "&" + $("Text1").name + "=" + encodeURIComponent($("Text1").value);
                    
                    
    ajax("?", onload, parametri);
    function onload()
    {
		var t = this.request.responseText;
		//var tx = this.request.responseXML;
        $("div1").innerHTML = t;
    }

}


// ]]>
    </script>  
</head>
<body>
    <form id="form1" runat="server">
        <input id="Text1" type="text" name="Text1" style="width: 448px;border:1px black solid;" value="v1=1&v2=1+2" />
        

        Richiama data server tramite ajax
        

        
        


        <div id="div1"></div>
    </form>
</body>
</html>
codice:
codice:
Option Strict On

Partial Class CorsoApogeo_ajax_semplice_ajax_semplice_ajax_1
    Inherits System.Web.UI.Page

    Protected Sub a1_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles a1.ServerClick
        'Me.Response.Write(DateTime.Now.ToString())
        Me.Response.Write("Me.IsPostBack = " & Me.IsPostBack & ", " & DateTime.Now.ToString())
        Me.Response.Write("

")
        Me.Response.Write(libreria.getForms())
        Me.Response.End()
    End Sub


    Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        Dim ex As Exception = Server.GetLastError()
        Me.Response.Write(ex.Message)
        Me.Response.End()
    End Sub

End Class

qualche spiegazione:
la pagina ha il link a1 runat server. Al click parte l'evento a1_onclick che fa la richiesta al server tramite chiamata ajax in modalità post. Oltre ad inviare il testo in Text1, invio pure gli hidden nascosti, __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE, __EVENTVALIDATION.
Il server fa partire correttamente l'evento a1_ServerClick e restituisce al chiamante:
IsPostBack
DateTime.Now.ToString(),
getForms() ->listato dei parametri form ricevuti, per assicurarmi che vengano ricevuti

Sembra che funzioni, però, detto tra me e te, non lo uso mai. Uso sempre il modo antico, ossia ricavo i parametri form ricevuti e li uso come voglio.
In pratica richiamo da client la pagina con una sintassi simile:

pagina.aspx?comando_ajax=recupera_dati

nel server recupero il parametro comando_ajax, lo valuto e proseguo, più o meno come hai scritto tu nella prima parte. Funziona sempre e lascia molta più libertà.