atlas调用本地web services那是相当的简单,调用远程的也不难,看了dflying chen的几篇文章也学了不少内容,尤其是yahoo天气预报的例子更是受益匪浅。自己动手实践一把。
目标:实现IP地址查询功能.输入IP地址,获得该IP所在的国家和城市。
难点:1)如何设置调用远程服务的asbx文件(有关配置支持asbx的方法可以见dflying chen 的介绍)
难点2):如何动态获得请求的客户端IP,然后在js中使用。
首先,建立一个网络服务,用于查询IP,IP地址信息库是一个mdb文件,相关代码为:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.Data.OleDb;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService

{
public Service ()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string[] GetIPAddress(string ip)
{
//数据库文件物理路径
string dbFilePath = Server.MapPath("~/App_Data/IPaddress.mdb");
//数据库连接字符串
string conStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbFilePath;
string country = "未知";
string city = "未知";
//数据库连接
OleDbConnection con = new OleDbConnection(conStr);
try
{
long ipAddress = System.Net.IPAddress.Parse(ip).Address;
string cmdText = " select top 1 * from dv_address where ip1 <= " + ipAddress + " and ip2 >= " + ipAddress;
con.Open();
OleDbCommand cmd = new OleDbCommand(cmdText, con);
OleDbDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
country = dr["country"].ToString();
city = dr["city"].ToString();
}
}
catch
{
return new string[]
{ country, city };
}
finally
{
con.Close();
}
return new string[]
{ country, city };
}
}
注意,该web services必须支持HTTP-Get方式访问,故需要如下web.config配置
<system.web>
<webServices>
<protocols>
<add name="HttpPost"/>
<add name="HttpGet"/>
</protocols>
</webServices>
</system.web>网络服务建好了,下面就是调用了。
建立一个新的网站,首先建立一个IPServices.asbx文件,该文件是将远程服务映射到本地的配置文件,有关信息见dflying chen的文章。文件内容如下:
<?XML version="1.0" encoding="utf-8"?>
<bridge namespace="n2dog" className="IpServices">
<proxy type="Microsoft.Web.Services.BridgeRestProxy" serviceUrl="http://127.0.0.1/IPServices/Service.asmx/GetIPAddress"></proxy>
<method name="GetIPAddress">
<input>
<parameter name="ip"></parameter>
</input>
</method>
</bridge>

调用页面为:

<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.ASPx.cs" Inherits="_Default" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xHTML11/DTD/xHTML11.dtd">
<HTML XMLns="http://www.w3.org/1999/xHTML">
<head runat="server">
<title>Untitled Page</title>
<script language="JavaScript" type="text/JavaScript">
function onGetCompleted(result)
{
$("country").innerHTML = "您的位置:"+result;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<atlas:ServiceReference Path="IPServices.asbx" />
</Services>
</atlas:ScriptManager>
<div>
<input id="Button1" type="button" value="button" onclick="getIpAddress()" /><div id="country"></div>
</div>
</form>

<script type="text/XML-script">
<page XMLns:script="http://schemas.microsoft.com/XML-script/2005">
<references>
</references>
<components>
</components>
</page>
</script>
</body>
</HTML>
因为javscript不容易获得本机IP地址,故在后台注册了脚本,解决第二个难点问题 :后台代码
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HTMLControls;
using System.Text;
public partial class _Default : System.Web.UI.Page 

{
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
string ip = Request.UserHostAddress;
sb.Append("<script language=\"JavaScript\" type=\"text/JavaScript\">");
sb.Append(" function getIpAddress(){var ip=""+ip+"";n2dog.IpServices.GetIPAddress({"ip":ip},onGetCompleted);}");
sb.Append("</script>");
string script = sb.ToString();
Page.RegisterClientScriptBlock("IpServices", script);
}
}这样目标即可实现,效果图: