标准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 ...
随机推荐
- Inno Setup 编译器
Inno Setup 编辑 Inno Setup用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.In ...
- leetcode 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...
- System Workbench for STM32(based on Eclipse)开发环境配置
导入现有项目 不能有同名项目,即使不是同一目录 编译 根目录的Debug目录是编译时自动生成的.另外如果项目使用了git,那么编译时会自动在根目录生成一个.gitignore文件,把Debug目录排除 ...
- commons工具类
转自:https://blog.csdn.net/leaderway/article/details/52387925 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不 ...
- oracle数据库中将clob字段内容利用java提取出至文本文档中
代码段: 1.执行clob转String public static String ClobToString(Clob sc) throws SQLException, IOException { S ...
- 2.ECMAScript 5.0
JS的引入方式 内接式 <script type="text/javascript"> </script> 外接式 <!--相当于引入了某个模块--& ...
- 线程概要 Java
线程 进程和线程的区别 串行:初期的计算机只能串行执行任务,大量时间等待用户输入 批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行 进程:进程独占内存空间,保存各自运行状态, ...
- PLSQL基本操作手册
第1章 用PLSQL连接Oracle数据库 PLSQL只能用来连接Oracle数据库(不象PB还可以连接JDBC.ODBC),所以必须首先安装并配置Oracle客户端. §1.1 初次登录PLSQL ...
- 看完MJ讲解的单例后的个人总结
1.单例的介绍 单例是iOS常用的开发模式的一种. 2.什么是单例 单例就是一个类只创建一个对象,只分配一次内存空间. 3.单例的应用场景 1)系统的单例: [UIApplication share ...
- Openfire服务端源代码开发配置指南[转]
转自:http://www.micmiu.com/opensource/openfire/openfire-src-config/ 本文将图文介绍如何把openfire(以3.8.1为例)源码配置 ...