.NET最强大的一个方面之一就是可以利用它创建Web服务。一个Web服务就是一个网站所提供的供其它网站调用的外部接口。
在你创建一个Web服务之前,你首先必须问问自己:“我要向我的用户提供什么服务?”。
在你创建一个Web服务之前,你首先必须问问自己:“我要向我的用户提供什么服务?”。
创建一个Web服务是很简单的,首先创建一个.asmx文件(你可以用Visual Studio .NET或你自己喜欢的任何文本编辑器,推荐使用Web Matrix,它有创建Web服务的模板),Web服务作为一个普通的类进行创建,在方法的前面有一个宏,表明这个方法是通过Web服务来访问的。
1.创建数据库Web Services
[WebMethod]
public DataSet SQLDB( string Query)
... {
try
...{
SqlConnection CS = new SqlConnection("server=(local)/NetSDK;database=Northwind;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter (Query, CS);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet, "Results");
return myDataSet;
}
catch(Exception ex)
...{
return DataError(ex);
}
}
public DataSet SQLDB( string Query)
... {
try
...{
SqlConnection CS = new SqlConnection("server=(local)/NetSDK;database=Northwind;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter (Query, CS);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet, "Results");
return myDataSet;
}
catch(Exception ex)
...{
return DataError(ex);
}
}
[WebMethod]
public DataSet AccessDB( string Query)
... {
try
...{
string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("AccessWebServices.mdb");
OleDbConnection myAccessConn = new OleDbConnection(strAccessConn);
OleDbCommand myAccessCommand = new OleDbCommand(Query,myAccessConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
myAccessConn.Open();
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet,"Results");
myAccessConn.Close();
return myDataSet;
}
catch(Exception ex)
...{
return DataError(ex);
}
}
public DataSet AccessDB( string Query)
... {
try
...{
string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("AccessWebServices.mdb");
OleDbConnection myAccessConn = new OleDbConnection(strAccessConn);
OleDbCommand myAccessCommand = new OleDbCommand(Query,myAccessConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
myAccessConn.Open();
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet,"Results");
myAccessConn.Close();
return myDataSet;
}
catch(Exception ex)
...{
return DataError(ex);
}
}
public
DataSet DataError(Exception ex)
... {
DataSet errDS = new DataSet("Errors");
DataTable errTable = errDS.Tables.Add("Error");
errTable.Columns.Add("Message");
errTable.Rows.Add(new Object[] ...{ex.Message});
return errDS;
}
... {
DataSet errDS = new DataSet("Errors");
DataTable errTable = errDS.Tables.Add("Error");
errTable.Columns.Add("Message");
errTable.Rows.Add(new Object[] ...{ex.Message});
return errDS;
}
客户端调用
private
void
menuItem1_Click(
object
sender,System.EventArgs e)
... {
WebServicesClient.localhost.DataBaseWebService Database = new WebServicesClient.localhost.DataBaseWebService();
DataSet ds = Database.SQLDB("select * from Products");
dataGrid1.DataSource = ds.Tables[0];
}
private void menuItem2_Click( object sender,System.EventArgs e)
... {
WebServicesClient.localhost.DataBaseWebService Database = new WebServicesClient.localhost.DataBaseWebService();
DataSet ds = Database.AccessDB("select * from AcessTableTest");
dataGrid1.DataSource = ds.Tables[0];
}
... {
WebServicesClient.localhost.DataBaseWebService Database = new WebServicesClient.localhost.DataBaseWebService();
DataSet ds = Database.SQLDB("select * from Products");
dataGrid1.DataSource = ds.Tables[0];
}
private void menuItem2_Click( object sender,System.EventArgs e)
... {
WebServicesClient.localhost.DataBaseWebService Database = new WebServicesClient.localhost.DataBaseWebService();
DataSet ds = Database.AccessDB("select * from AcessTableTest");
dataGrid1.DataSource = ds.Tables[0];
}
2.通过Web Services下载文件
GetBinaryFile.cs
using
System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.UI;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
/**/ /// <summary>
/// GetBinaryFile 的摘要说明
/// </summary>
[WebService(Namespace = " http://localhost/ " )]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class GetBinaryFile : System.Web.Services.WebService ... {
public GetBinaryFile () ...{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod(Description = "Web 服务提供的方法,返回给定文件的字节数组")]
public byte[] GetImage(string requestFileName)
...{
/**////得到服务器端的一个图片
///如果你自己测试,注意修改下面的实际物理路径
if (requestFileName == null || requestFileName == "")
return getBinaryFile(Server.MapPath("/img/propic.gif"));
else
return getBinaryFile(Server.MapPath(requestFileName));
}
/**//// <summary>
/// getBinaryFile:返回所给文件路径的字节数组。
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public byte[] getBinaryFile(string filename)
...{
if (File.Exists(filename))
...{
try
...{
/**////打开现有文件以进行读取。
FileStream s = File.OpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch (Exception e)
...{
return new byte[0];
}
}
else
...{
return new byte[0];
}
}
/**//// <summary>
/// ConvertStreamToByteBuffer:把给定的文件流转换为二进制字节数组。
/// </summary>
/// <param name="theStream"></param>
/// <returns></returns>
public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
...{
int b1;
System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
while ((b1 = theStream.ReadByte()) != -1)
...{
tempStream.WriteByte(((byte)b1));
}
return tempStream.ToArray();
}
[WebMethod(Description = "Web 服务提供的方法,返回给定文件类型。")]
public string GetImageType()
...{
// if (mytype.Trim() == "flash")
// return "movie/swf";
// else
/**////这里只是测试,您可以根据实际的文件类型进行动态输出
return "image/jpg";
}
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.UI;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
/**/ /// <summary>
/// GetBinaryFile 的摘要说明
/// </summary>
[WebService(Namespace = " http://localhost/ " )]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class GetBinaryFile : System.Web.Services.WebService ... {
public GetBinaryFile () ...{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod(Description = "Web 服务提供的方法,返回给定文件的字节数组")]
public byte[] GetImage(string requestFileName)
...{
/**////得到服务器端的一个图片
///如果你自己测试,注意修改下面的实际物理路径
if (requestFileName == null || requestFileName == "")
return getBinaryFile(Server.MapPath("/img/propic.gif"));
else
return getBinaryFile(Server.MapPath(requestFileName));
}
/**//// <summary>
/// getBinaryFile:返回所给文件路径的字节数组。
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public byte[] getBinaryFile(string filename)
...{
if (File.Exists(filename))
...{
try
...{
/**////打开现有文件以进行读取。
FileStream s = File.OpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch (Exception e)
...{
return new byte[0];
}
}
else
...{
return new byte[0];
}
}
/**//// <summary>
/// ConvertStreamToByteBuffer:把给定的文件流转换为二进制字节数组。
/// </summary>
/// <param name="theStream"></param>
/// <returns></returns>
public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
...{
int b1;
System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
while ((b1 = theStream.ReadByte()) != -1)
...{
tempStream.WriteByte(((byte)b1));
}
return tempStream.ToArray();
}
[WebMethod(Description = "Web 服务提供的方法,返回给定文件类型。")]
public string GetImageType()
...{
// if (mytype.Trim() == "flash")
// return "movie/swf";
// else
/**////这里只是测试,您可以根据实际的文件类型进行动态输出
return "image/jpg";
}
}
客户端调用
GetBinaryFileShow.aspx.cs
using
System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.Services;
using System.Configuration;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class GetBinaryFileShow : System.Web.UI.Page
... {
protected void Page_Load(object sender, System.EventArgs e)
...{
string imgurl = "",mytype="";
if (this.Request.QueryString["imgurl"].ToString().Trim()!=null)
imgurl = this.Request.QueryString["imgurl"].ToString();
if (this.Request.QueryString["mytype"].ToString().Trim() != null)
mytype = this.Request.QueryString["mytype"].ToString();
// 在此处放置用户代码以初始化页面
/**////定义并初始化文件对象;
localhost.GetBinaryFile oImage;
oImage = new localhost.GetBinaryFile();
/**////得到二进制文件字节数组;
byte[] image = oImage.GetImage(imgurl);
/**////转换为支持存储区为内存的流
System.IO.MemoryStream memStream = new System.IO.MemoryStream(image);
/**////定义并实例化Bitmap对象
Bitmap bm = new Bitmap(memStream);
/**////根据不同的条件进行输出或者下载;
Response.Clear();
/**////如果请求字符串指定下载,就下载该文件;
///否则,就显示在浏览器中。
if (Request.QueryString["Download"] == "1")
...{
Response.Buffer = true;
Response.ContentType = "application/octet-stream";
/**////这里下载输出的文件名字 ok.jpg 为例子,你实际中可以根据情况动态决定。
Response.AddHeader("Content-Disposition", "attachment;filename=ok.jpg");
}
else
Response.ContentType = oImage.GetImageType();
Response.BinaryWrite(image);
Response.End();
}
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.Services;
using System.Configuration;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class GetBinaryFileShow : System.Web.UI.Page
... {
protected void Page_Load(object sender, System.EventArgs e)
...{
string imgurl = "",mytype="";
if (this.Request.QueryString["imgurl"].ToString().Trim()!=null)
imgurl = this.Request.QueryString["imgurl"].ToString();
if (this.Request.QueryString["mytype"].ToString().Trim() != null)
mytype = this.Request.QueryString["mytype"].ToString();
// 在此处放置用户代码以初始化页面
/**////定义并初始化文件对象;
localhost.GetBinaryFile oImage;
oImage = new localhost.GetBinaryFile();
/**////得到二进制文件字节数组;
byte[] image = oImage.GetImage(imgurl);
/**////转换为支持存储区为内存的流
System.IO.MemoryStream memStream = new System.IO.MemoryStream(image);
/**////定义并实例化Bitmap对象
Bitmap bm = new Bitmap(memStream);
/**////根据不同的条件进行输出或者下载;
Response.Clear();
/**////如果请求字符串指定下载,就下载该文件;
///否则,就显示在浏览器中。
if (Request.QueryString["Download"] == "1")
...{
Response.Buffer = true;
Response.ContentType = "application/octet-stream";
/**////这里下载输出的文件名字 ok.jpg 为例子,你实际中可以根据情况动态决定。
Response.AddHeader("Content-Disposition", "attachment;filename=ok.jpg");
}
else
Response.ContentType = oImage.GetImageType();
Response.BinaryWrite(image);
Response.End();
}
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
<
asp:Image ID
=
"
Image1
"
ImageUrl
=
"
GetBinaryFileShow.aspx?imgurl=
"
runat
=
"
server
"
/>