标准webservice调用
现代定义的webservice一般都倾向于restfull风格的http请求,但工作中还是会遇到前辈们写的时代代码。
我们更倾向于封装代码来调用,而不是服务引用。请看:
Service.asmx服务的注解
[WebService(Namespace = "http://shanghai.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{}
Web.config配置文件重要节点
<system.web>
<httpRuntime requestValidationType="Service.RequestValidatorDisabled" />
<webServices>
<protocols>
<add name="HttpPost"/>
<add name="HttpGet"/>
</protocols>
</webServices>
<compilation debug="true" targetFramework="4.0"/>
</system.web> <system.webServer>
<defaultDocument>
<files>
<add value="Service.asmx"/>
</files>
</defaultDocument>
</system.webServer>
public class RequestValidatorDisabled : System.Web.Util.RequestValidator
{
protected override bool IsValidRequestString(System.Web.HttpContext context, string value, System.Web.Util.RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{ validationFailureIndex = -;
return true;
}
}
以上不加验证也可。
客户端调用工具
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方式提交
public static T Post<T>(string url, Dictionary<string, string> kvs)
{
var data = "";
foreach (var k in kvs.Keys)
{
if (string.IsNullOrEmpty(data))
{
data += k + "=" + kvs[k];
}
else
{
data += "&" + k + "=" + kvs[k];
}
} HttpWebRequest rq = null; try
{
rq = WebRequest.Create(url) as HttpWebRequest;
}
catch (Exception) { throw new Exception("错误:WEBSERVICE地址无效"); } rq.Method = "POST";
rq.ContentType = "application/x-www-form-urlencoded"; byte[] bs = Encoding.UTF8.GetBytes(data);
rq.ContentLength = bs.Length;
try
{
using (Stream writer = rq.GetRequestStream())
{
if (bs.Length > )
{
writer.Write(bs, , bs.Length);
}
}
}
catch (Exception) { throw new Exception("错误:发送失败,网络异常"); } var response = "";
try
{
var rp = rq.GetResponse() as HttpWebResponse; using (Stream reader = rp.GetResponseStream())
{
response = new StreamReader(reader, Encoding.UTF8).ReadToEnd();
}
}
catch (Exception err) { throw new Exception("错误:接收失败,网络异常"); } try
{
return Deserialize<T>(TrimXmlns(response), false);
}
catch (Exception err) { throw new Exception("错误:数据序列化异常"); }
} private static string TrimXmlns(string source)
{
return source.Replace("xmlns=\"http://shanghai.org/\"", "");
}
服务端定义接口
[WebMethod(Description = "导入Excel移库计划")]
public TransExcelDto ImportTransExcel(string data)
{
try
{
var tf = Common.Utilities.Deserialize<TransExcelDto>(data); return DataAccess.ImportTransExcel(tf);
}
catch (Exception e)
{
return new TransExcelDto().Failure(, e.Message) as TransExcelDto;
}
}
调用举例,注意下面的key = data,即使接口的参数
TransExcelDto request = new TransExcelDto() { SessionId = Cache.SessionId };
var postData = new Dictionary<string, string>();
postData.Add("data", Common.Utilities.Serialize<TransExcelDto>(request));
TransExcelDto result = Common.Utilities.Post<TransExcelDto>(Metadata.WebServiceUrl + "/ImportTransExcel", postData);
标准webservice调用的更多相关文章
- webservice调用和生成
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- 使用自定义签名的https的ssl安全问题解决和metro的webservice调用
最近一直在忙新的项目,每天加班到8点多,都没来写博客了.新的项目遇到了很多问题,现在趁着突然停电来记录下调用https的问题吧. 我们服务主要是,我们调用数据源数据,并且再提供接口供外部数据调用. 我 ...
- C#动态webservice调用接口 (JAVA,C#)
C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...
- WebService 调用
一.WebService调用 1.webservice支持四种调用方式:SOAP 1.1,SOAP 1.2,GET,POST. 2.如果要webservice支持GET,POST调 ...
- 使用XmlInclude解决WebService调用时无法识别子类的异常
一.定义抽象类及子类,WebMethod实际返回子类参数 //使用XmlInclude解决WebService调用时无法识别子类的异常 [System.Xml.Serialization.XmlInc ...
- WebService调用一对多关联关系时出现 死循环:A cycle is detected in...
通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...
- C# ASP.NET Webservice调用外部exe无效的解决方法
最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决 ...
- 【技术贴】webservice 调用 Transport error : 401 Error:Una
解决 webservice 调用之后报错:调用异常:Transport error : 401 Error:Unauthorized 授权失败. 加入如下代码 //Sap需要ws-security的认 ...
- WebService调用1(.Net)
1.创建一个最简单的Web Service (1) 新建-项目-ASP.NET空WEB应用程序 (2)添加新项-WEB服务 默认会添加一个HelloWorld方法: using System; us ...
随机推荐
- pageadmin网站制作 如何修改和管理网站模板
在使用pageadmin CMS 的同时,遇到问题可以参考官网帮助中心.1.网站模板目录地址/templates目录, 2.点击展开后,每个目录就是一个网站模板, 前端设计师制作的新版本都可以放到这个 ...
- Mysql数据操作《三》多表查询
多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create table employ ...
- Linux环境下动态链接库的生成和使用
使用自己封装的so时遇到了点问题,本着简便原则决定写个demo看看,顺便记录下整个过程. 1)生成so所需的文件如下: print.h #ifndef __print_h__ #define __pr ...
- kali linux之msf信息收集
nmap扫描 Auxiliary 扫描模块 目前有557个扫描方式
- jquery加载方式,选择器,样式操作
原生js和css不兼容,jquery已经过测试,可放心使用 https://code.jquery.com 这个网站可以下载jquery的源码,比如把源码下载到js文件夹中,文件名为jquery- ...
- nginx高性能WEB服务器系列之四配置文件详解
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- 编程开发之--Java集合类继承与实现必备知识
1.LinkedHashSet有序链式集合 举例: long startTime=System.currentTimeMillis(); LinkedHashSet oprTypeSet = new ...
- 接口自动化之unittest初探
最近几天苦心钻研unittest,终于略有所得,所以想来跟大家分享一下.有关python和unittest的基础知识部分就不在一一细说,相信各位也不是小白了.如果需要我整理基础知识,欢迎留言,我会看情 ...
- 基础篇:3.3)规范化:3d装配图
本章目的:规范化3d零件装配图,弄清楚装配层级划分,这也是机械的基本功夫. 1.装配通用原则 在装配建模设计中,应遵循以下通用原则:a)所有的装配单元应具有唯一性和稳定性,不允许冗余元素存在: //就 ...
- 「BZOJ3998」[TJOI2015] 弦论(第K小子串)
https://www.lydsy.com/JudgeOnline/problem.php?id=3998 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input ...