1.首先,創建一個Web空項目
2.添加一個html或aspx頁面
3.頁面代碼如所示:
<!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>
<title>js請求dll獲取數據</title>
<script type="text/javascript">
//獲取Ajax
var xmlHTTP="";
function getXMLHTTP() {
try {
xmlHTTP = new XMLHttpRequest();
} catch (e) {
try {
xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("你的瀏覽不支持Ajax,請換用最新版本瀏覽器瀏覽本頁面!");
}
}
}
}
//開始對服務器發送請求,這里我沒有使用任何第三方js庫,如果你使用第三方js庫,獲取更方便,參數傳遞跟簡單規范
//參數說明:c-dll中的類名,m-類中的方法名 args-方法需要的參數,一個Array數組
//需要說明的是這里的類名也可以傳命名空間.類名,我這里沒有,那么我會在服務器端去拼接成命名空間.類名的形式
function send(c, m,args) {
//獲取Ajax
getXMLHTTP();
if (xmlHTTP != "") {
//設置回調函數
xmlHTTP.onreadystatechange = msg;
//設置請求方式,路徑等,Data.axd類似於ashx,但也有區別
xmlHTTP.open("POST", "Data.axd", true);
//這里對於方法參數的傳遞可以有多種方式,比如json(需要第三方js,如果不想手動構建的話)或直接以get方式請求服務器,將參數附在URL中,但不介意那樣做,各有所好
var data = "Class=" + c + "&Method=" + m + "&Args=" + args;
//這句話一般出現以post請求的方式中,必須在調用了open后使用
xmlHTTP.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=UTF-8;');
//send一定要小寫
xmlHTTP.send(data);
//下一步就是建立類庫,以便訪問
}
else {
alert("獲取Ajax異常!");
}
}
//回調函數
function msg() {
if (xmlHTTP.readyState == 4) {
if (xmlHTTP.status == 200) {
document.getElementById("show_msg").innerHTML = xmlHTTP.responseText;
}
}
}
//登錄的函數
function Login() {
var args = new Array();
//這里其實可以傳json格式的對象,然后在服務器端直接將json轉換為對應的對象,需要第三方js或手動構建json格式數據
//這里添加順序必須與要調用的后台方法一致
args.push("admin");
args.push("123456");
//類名 方法名 方法所需參數
send("MyLogin", "Login", args);
}
</script>
</head>
<body>
<input id="Login" type="button" value="登錄" onclick="Login()"/>
<div id="show_msg">
</div>
</body>
</html>
4.可以看到請求路徑為Data.axd,接下來就在配置文件中配置針對請求路徑為該路徑的請求提交有哪個來接手和處理
配置如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 有關如何配置 ASP.NET 應用程序的詳細消息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 -->
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpHandlers>
//path:請求路徑 type:一般由dll中的命名空間名.具體類名,命名空間名 兩部分組成 verb:針對什么請求方式 *表示所有
<add path="Data.axd" type="Mydll.MyServe,Mydll" verb="*"/>
</httpHandlers>
</system.web>
</configuration>
5.到這里前端基本完成了,接下來看看服務器端
6.首先你需要在原項目解決方案中新建一個類庫項目,如圖所示:

說明:MyServe為我定義的處理類的類名,即所有請求路徑為Data.axd的請求都會提交給他處理,可以參考配置文件中的type屬性值看
7.實現MyServe類,將其變為最終請求的處理中心
代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Reflection;
namespace Mydll {
//需要添加引用 System.Web
//實現IHttpHandler接口
public class MyServe:IHttpHandler
{ #region IHttpHandler 成員
bool IHttpHandler.IsReusable
{
get { return true; }
}
//其實這個類類似於Web中的ashx,但代碼不在Web項目中實現的,簡單點可以理解為把最終服務處理中心搬到了這個類中,當然只是對某些規定的請求路徑
void IHttpHandler.ProcessRequest(HttpContext context)
{
//這里就是最終處理的請求的地方
//獲取請求參數
//以post方式請求的參數獲取可以任選一下一種方式
//context.Request["Class"].toString();
//get方式可以使用一下兩種方式獲取參數
//context.Request.QueryString["Class"].toString();
//context.Request.Params["Class"].toString();
//得到類名,我的請求方式是POST
string Class = context.Request.Form["Class"].ToString();
//得到類中方法名
string Method = context.Request.Form["Method"].ToString();
//得到參數,因為參傳過來后將會變成"aaaa,bbbbbb,cccc,....."的形式,所以我說使用json會更好,可以直接傳對象過來更規范點
string arg = context.Request.Form["Args"].ToString();
object[] args=null;
if (arg != "" && arg.Length > 0)
{
//說明有實參,將其轉換為數組對象
args=new object[arg.Length];
args = arg.Split(',');
}
//到此得到了類名、方法名、方法參數,接下來就是調用指定類中的指定方法
object rsu=Dispose(Class, Method, args);
context.Response.Write(rsu);
}
string NameSpace="Mydll.";
/// <summary> /// 處理中心 /// </summary>
/// <param name="c">類名</param>
/// <param name="m">方法名</param>
/// <param name="args">方法所需參數</param>
/// <returns></returns>
private object Dispose(string c, string m, params object[] args)
{
c = NameSpace + c;//組合為命名空間.類名
Type t = Type.GetType(c);
//需要導入命名空間System.Reflection;
MethodInfo mt = t.GetMethod(m);
//獲取該方法所需要的參數
ParameterInfo[] ps = mt.GetParameters();
if (ps.Length > 0)
{
//該方法存在參數
//激活該方法
object obj = t.Assembly.CreateInstance(m);
if (args != null)//可以對錯誤進行捕捉並進行記錄
{
//調用該方法並傳入參數
return mt.Invoke(obj, args);
}
else
{
return "訪問服務器出錯,在准備調用" + c + "類中的" + m + "方法時參數錯誤";
}
}
else
{
//激活並調用
object obj = t.Assembly.CreateInstance(m);
return mt.Invoke(obj, null);
}
}
#endregion
}
}
8.很明顯,仔細看我頁面上的代碼會發現,我要調用的是MyLogin類中的Login方法,並傳入了用戶名和密碼
9.當我發送請求后,服務器會將請求交給MyServe類處理,MyServe類找到我要調用的類中的方法並調用,接下來我需要創建MyLogin類,並定義Login方法(可以看到上圖中,類庫項目中有一個MyLogin類)
代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Mydll
{
public class MyLogin
{
//方法最好以public static修飾
public static string Login(string name, string pwd)
{
if (name == "admin" && pwd == "123456")
{
//也可以在這里對要返回的數據格式進行序列化,這樣對於復雜的數據js可以有效解析
return "登錄成功!";
}
else
{
return "登錄失敗";
}
}
}
}
10.最后附上運行后的圖片:

點擊后:


-------------

