C#使⽤HttpPost⽅式传递Json数据字符串调⽤
WebService
引⾔
  前段时间⼀直在做⼀个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿。现在想将业务逻辑层以下部分和界⾯层分离,使⽤Web Service来做。由于C#中通过直接添加引⽤的⽅来调⽤Web Service的⽅式不够灵活,故采取⼿动发送Http请求的⽅式来调⽤Web Service。最后选择使⽤Post⽅式来调⽤Web Service,⾄于安全性和效率暂不考虑。在学习使⽤的过程,遇到了很多问题,也花了很长时间来解决,⽹上相关的帖⼦很少,如果各位在使⽤的过程中有⼀些问题难以解决,可以我哦。
前提
  使⽤Post⽅式调⽤Web Service,需要在服务项⽬配置⽂件fig中添加使⽤Http协议的配置,在<system.web>标签中添加<webServices> <protocols> <add name= "HttpPost"/></protocols></webServices>配置,同时我们还可以添加
<customErrors mode="Off" />配置,这样可以在服务⽅法的返回值带出服务⽅法调⽤的异常信息,异常信息同样以xml的形式返回,这样便于客户端进⾏调试。
Web Service接⼝⽅法
[WebMethod]
public string Project(string paramaters)
{
调用webservice服务return paramaters;
}
实现代码
public string Post(string methodName, string jsonParas)
{
string strURL = Url + "/" + methodName;
//创建⼀个HTTP请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
//Post请求⽅式
request.Method = "POST";
//内容类型
request.ContentType = "application/x-www-form-urlencoded";
//设置参数,并进⾏URL编码
//虽然我们需要传递给服务器端的实际参数是JsonParas(格式:[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}]),
//但是需要将该字符串参数构造成键值对的形式(注:"paramaters=[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}]"),
//其中键paramaters为WebService接⼝函数的参数名,值为经过序列化的Json数据字符串
//最后将字符串参数进⾏Url编码
string paraUrlCoded = System.Web.HttpUtility.UrlEncode("paramaters");
paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode(jsonParas);
byte[] payload;
//将Json字符串转化为字节
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
//设置请求的ContentLength
request.ContentLength = payload.Length;
//发送请求,获得请求流
Stream writer;
try
{
writer = request.GetRequestStream();//获取⽤于写⼊请求数据的Stream对象
}
catch (Exception)
{
writer = null;
Console.Write("连接服务器失败!");
}
//将请求参数写⼊流
writer.Write(payload, 0, payload.Length);
writer.Close();//关闭请求流
String strValue = "";//strValue为http响应所返回的字符流
HttpWebResponse response;
try
{
//获得响应流
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
}
Stream s = response.GetResponseStream();
/
/服务器端返回的是⼀个XML格式的字符串,XML的Content才是我们所需要的Json数据
XmlTextReader Reader = new XmlTextReader(s);
Reader.MoveToContent();
strValue = Reader.ReadInnerXml();//取出Content中的Json数据
Reader.Close();
s.Close();
return strValue;//返回Json数据
}
Url的格式样例: "59.68.29.106:8087/IFT_Project.asmx"
  methodName参数就是"Project"
  JsonParas就是使⽤C# JavaScriptSerializer将List<Object>类型的对象序列化之后得到的值,数据格
式:[{\"UserID\":\"0206001\",\"UserName\":\"ceshi\"}],Json数据中的中括号代表由着多个对象集合序列化,花括号代表⼀个对象序列化得到的结果,花括号⾥⾯的内容使⽤键值对的⽅式展⽰,多个属性之间⽤逗号隔开,每个对象也⽤逗号隔开。
  request.ContentType必须设置值,建议使⽤"application/x-www-form-urlencoded",设置其他值就很容易报服务器内部异常,使⽤这种⽅式服务接⼝⽅法返回的是xml格式的字符串
  payload将请求参数转换成⼆进制来保存,此处⼀定要将“paramaters”加⼊其中,不然会报异常缺少参数,paramaters就是服务接⼝函数的参数名。函数中使⽤了URL编码,注意在编码的时候只需要将键和值进⾏编码,不要将中间的=进⾏编码,不然getResponse的时候会报异常。
  request.ContentLength也是必须设置的值
  在得到响应流之后Stream s = response.GetResponseStream();需要使⽤Reader来解析响应流,这个地⽅我使⽤的是XmlTextReader,因为我服务⽅法返回的是xml格式的字符串,其中Json数据在xml的Content中。在取出Json数据之后,再进⾏相应的反序列化即可得到对象。
⼩结
  在学习使⽤Post调⽤⽅式的过程中,查看了⼀些帖⼦,但是⽹上的帖⼦很少,不少帖⼦中也给出了⼀
下Post⽅法的样例,给出的很多post⽅法没有明确给出传⼊字符串的格式,导致我的传⼊参数jsonParas缺少了键paramaters,测试调试了很久才发现这个错误,最终差点放弃了。还有ContentType的设置也很重要,使⽤其他的值对传⼊参数的要求很⾼,初学者不建议使⽤其他⽅式。初期使⽤Post⽅式的时候,在getResponse()处容易报异常,可以设置customerErrors mode将异常信息返回给客户端,这样容易调试。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。