分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

标准webservice调用

发布时间:2023-09-06 01:49责任编辑:郭大石关键词:webservice

现代定义的webservice一般都倾向于restfull风格的http请求,但工作中还是会遇到前辈们写的时代代码。

我们更倾向于封装代码来调用,而不是服务引用。请看:

Service.asmx服务的注解

1 ????[WebService(Namespace = "http://shanghai.org/")]2 ????[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]3 ????[System.ComponentModel.ToolboxItem(false)]4 ????// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 5 ????// [System.Web.Script.Services.ScriptService]6 ????public class Service : System.Web.Services.WebService7 ????{}

Web.config配置文件重要节点

 1 ??<system.web> 2 ????<httpRuntime requestValidationType="Service.RequestValidatorDisabled" /> 3 ????<webServices> 4 ??????<protocols> 5 ????????<add name="HttpPost"/> 6 ????????<add name="HttpGet"/> 7 ??????</protocols> 8 ????</webServices> 9 ????<compilation debug="true" targetFramework="4.0"/>10 ??</system.web>11 12 ??<system.webServer>13 ????<defaultDocument>14 ??????<files>15 ????????<add value="Service.asmx"/>16 ??????</files>17 ????</defaultDocument>18 ??</system.webServer>
1 ????public class RequestValidatorDisabled : System.Web.Util.RequestValidator2 ????{3 ????????protected override bool IsValidRequestString(System.Web.HttpContext context, string value, System.Web.Util.RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)4 ????????{5 6 ????????????validationFailureIndex = -1;7 ????????????return true;8 ????????}9 ????}

以上不加验证也可。

客户端调用工具

 ???????public static string Serialize<T>(T entity, bool base64 = true) ???????{ ???????????using (System.IO.StringWriter sw = new System.IO.StringWriter()) ???????????{ ???????????????XmlSerializer serializer = new XmlSerializer(typeof(T)); ???????????????serializer.Serialize(sw, entity); ???????????????if (base64) ???????????????{ ???????????????????return Convert.ToBase64String(Encoding.UTF8.GetBytes(sw.ToString())); ???????????????} ???????????????else ???????????????{ ???????????????????return sw.ToString(); ???????????????} ???????????} ???????} ???????public static T Deserialize<T>(string data, bool base64 = true) ???????{ ???????????var xml = ""; ???????????if (base64) ???????????{ ???????????????xml = Encoding.UTF8.GetString(Convert.FromBase64String(data.Replace(" ", "+"))); ???????????} ???????????else ???????????{ ???????????????xml = data; ???????????} ???????????using (System.IO.StringReader sr = new System.IO.StringReader(xml)) ???????????{ ???????????????XmlSerializer deserializer = new XmlSerializer(typeof(T)); ???????????????return (T)deserializer.Deserialize(sr); ???????????} ???????}

请求方法(去掉服务器返回的服务的命名空间),都以POST方式提交

 1 ????????public static T Post<T>(string url, Dictionary<string, string> kvs) 2 ????????{ 3 ????????????var data = ""; 4 ????????????foreach (var k in kvs.Keys) 5 ????????????{ 6 ????????????????if (string.IsNullOrEmpty(data)) 7 ????????????????{ 8 ????????????????????data += k + "=" + kvs[k]; 9 ????????????????}10 ????????????????else11 ????????????????{12 ????????????????????data += "&" + k + "=" + kvs[k];13 ????????????????}14 ????????????}15 16 ????????????HttpWebRequest rq = null;17 18 ????????????try19 ????????????{20 ????????????????rq = WebRequest.Create(url) as HttpWebRequest;21 ????????????}22 ????????????catch (Exception) { throw new Exception("错误:WEBSERVICE地址无效"); }23 24 ????????????rq.Method = "POST";25 ????????????rq.ContentType = "application/x-www-form-urlencoded";26 27 ????????????byte[] bs = Encoding.UTF8.GetBytes(data);28 ????????????rq.ContentLength = bs.Length;29 ????????????try30 ????????????{31 ????????????????using (Stream writer = rq.GetRequestStream())32 ????????????????{33 ????????????????????if (bs.Length > 0)34 ????????????????????{35 ????????????????????????writer.Write(bs, 0, bs.Length);36 ????????????????????}37 ????????????????}38 ????????????}39 ????????????catch (Exception) { throw new Exception("错误:发送失败,网络异常"); }40 41 ????????????var response = "";42 ????????????try43 ????????????{44 ????????????????var rp = rq.GetResponse() as HttpWebResponse;45 46 ????????????????using (Stream reader = rp.GetResponseStream())47 ????????????????{48 ????????????????????response = new StreamReader(reader, Encoding.UTF8).ReadToEnd();49 ????????????????}50 ????????????}51 ????????????catch (Exception err) { throw new Exception("错误:接收失败,网络异常"); }52 53 ????????????try54 ????????????{55 ????????????????return Deserialize<T>(TrimXmlns(response), false);56 ????????????}57 ????????????catch (Exception err) { throw new Exception("错误:数据序列化异常"); }58 ????????}59 60 ????????private static string TrimXmlns(string source)61 ????????{62 ????????????return source.Replace("xmlns=\"http://shanghai.org/\"", "");63 ????????}

服务端定义接口

 1 ????????[WebMethod(Description = "导入Excel移库计划")] 2 ????????public TransExcelDto ImportTransExcel(string data) 3 ????????{ 4 ????????????try 5 ????????????{ 6 ????????????????var tf = Common.Utilities.Deserialize<TransExcelDto>(data); 7 ?8 ????????????????return DataAccess.ImportTransExcel(tf); 9 ????????????}10 ????????????catch (Exception e)11 ????????????{12 ????????????????return new TransExcelDto().Failure(98, e.Message) as TransExcelDto;13 ????????????}14 ????????}

调用举例,注意下面的key = data,即使接口的参数

1 TransExcelDto request = new TransExcelDto() { SessionId = Cache.SessionId };2 3 4 var postData = new Dictionary<string, string>();5 postData.Add("data", Common.Utilities.Serialize<TransExcelDto>(request));6 7 TransExcelDto result = Common.Utilities.Post<TransExcelDto>(Metadata.WebServiceUrl + "/ImportTransExcel", postData);

标准webservice调用

原文地址:https://www.cnblogs.com/jonney-wang/p/8796971.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved