WebService作为一种服务,它不需要客户端提供额外的软件支持,只要客户端支持HTTP协议和XML这样两个特性就可以了。对WebService自身来讲,它本身就是一种自我描述型的设计,所以服务端和客户端可以通过它来响应和处理请求的内容及格式。
XML是一种平台无关、语言无关的文档结构,因此WebService是一种可以跨平台的Web API。WebService能够让客户端像调用本地代码一样调用服务端代码,所以WebService是一种分布式计算的Web应用程序组件。我们对WebService下了如此多的定义,其实核心是什么呢?核心是WebService是一种基于HTTP协议和XML的Web API。在C/S结构中,我们经常用到.NET框架提供asmx封装的接口调用,通过WebService实现服务端数据的交互。
下述为通过asmx方式利用C#语言实现的客户端webservice请求:
/* 客户端要求返回JSON格式的数据 */
Public void JSON_GetService(objectsender, EventArgs e)
{
try
{
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(""http://IP/webservice/Test/service.asmx/GetData",");
//要求参数为标准的名称值对
string strPostdata = "sysFlag=1&AU=2&lastReadTime=&orgID=";
request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
// 如果要求参数为json格式,请屏蔽上述配置开启下述配置
// string strPostdata ="{sysFlag:1,AU:2,lastReadTime:'',orgID:''}";
// request.ContentType ="application/json";//如果参数格式为json
//接受数据的格式:两种方式xml或者json
// request.Accept ="application/xml";
request.Accept = "application/json";
//函数参数传递以post格式传递(必须)
request.Method = "POST";
//将参数传递到被调用方
byte[] buffer = Encoding.Default.GetBytes(strPostdata);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
//等待返回值并进行处理
string responseStr = string.Empty;
/* 处理服务器端返回数据,服务端返回DataSet的序列化数据 */
using (HttpWebResponse response =request.GetResponse() as HttpWebResponse)
{
System.IO.Stream respStream =response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(respStream,Encoding.UTF8);
responseStr = reader.ReadToEnd();
}
if (request.Accept == "application/json")
{
DataSet ds = JsonConvert.DeserializeObject(responseStr, typeof(DataSet)) asDataSet;
}
else if(request.Accept == "application/xml")
{
StringReader sr1 = new StringReader(responseStr);
XmlSerializer xmldes = newXmlSerializer(typeof(DataSet));
DataSet ds = xmldes.Deserialize(sr1) asDataSet;
}
}
catch (WebException ex)
{
var rsp = ex.Response as HttpWebResponse;
StreamReader sr = new StreamReader(rsp.GetResponseStream(),Encoding.UTF8);
string strHtml = sr.ReadToEnd();
int httpStatusCode = (int)rsp.StatusCode;
}
}
[ WebMethod(EnableSession = true, Description = "WebService测试")]
publicvoid GetData (string sysFlag, string AU, string lastReadTime, stringorgID)
{
string serializeValue = string.Empty;
// 获取DataSet数据
DataProcess dp = new DataProcess();
DataSet ds = dp.GetDatsSet (sysFlag, AU, lastReadTime, orgID);
// 序列化处理
string[] requestType = HttpContext.Current.Request.AcceptTypes;
IList TypeList = requestType as IList;
if(TypeList != null)
{
if (TypeList.Contains("application/xml") ||TypeList.Contains("text/xml"))
{
//XML序列化
serializeValue = XMLSerializerData(ds);
}
else if (TypeList.Contains("application/json") ||TypeList.Contains("text/javascript"))
{
// json序列化
serializeValue = JsonConvert.SerializeObject(ds);
}
}
else
{
// json 序列化
serializeValue = JsonConvert.SerializeObject(ds);
}
//通过Response方式返回,避免return方式时JSON时{"d":"实际值"}格式的出现
Context.Response.ContentEncoding = System.Text.Encoding.UTF8;
Context.Response.Write(serializeValue);
Context.Response.Flush();
Context.Response.End();
Context.Response.Close();
}