标准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 ...
随机推荐
- cannot be resolved to a type (Java)
最近经常遇到cannot be resolved to a type (Java)报错,以下为在网上找到的解决方案: 1.先看看有没有引用相关jar包2.检查jar是否引用了多个相同的,或者多个jar ...
- Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...
- 903. Valid Permutations for DI Sequence
We are given S, a length n string of characters from the set {'D', 'I'}. (These letters stand for &q ...
- 一键生成ssl自签名证书脚本
#!/bin/bash -e # * 为必改项 # * 更换为你自己的域名 CN='' # 例如: demo.rancher.com # 扩展信任IP或域名 ## 一般ssl证书只信任域名的访问请求, ...
- vue.js 一些知识点
vue.js 也是试图层的运用方法,跟react的方法类似,不过也有许多的不同地方: 1.vue.js 对于数据也是用{{ }} 进行数据更新: 2.vue.js 使用 v-html 指令用于输出 h ...
- MongoDB 学习笔记四 C#调用MongoDB
驱动 下载 https://github.com/mongodb/mongo-csharp-driver/downloads 项目地址: https://github.com/mongodb/mong ...
- 解决方法:配置群集时# gem install redis 报错:Unable to require openssl, install OpenSSL and rebuild ruby
问题:前面已经在/usr/local/src安装了ruby-2.3.0.tar.gz.rubygems-2.4.2.tar.gz.在配置 redis-3.1.1 群集中,使用gem install 安 ...
- selenium自动加载Flash
当我们在定位的时候,有时候会碰到Flash问题导致无法定位到元素 通过下面的代码就能解决问题 参考:https://blog.csdn.net/qq_37913997/article/details/ ...
- ubuntu 16.04 安装opencv 2.4.13
ubuntu 16.04 安装opencv 2.4.13 https://blog.csdn.net/u011557212/article/details/54706966?utm_source=it ...
- Linux Python import jenkins 报错 oserror: /usr/lib/python2.7/site-packages/lookup3.so
安装了jenkins和Python-jenkins后,在脚本中import jenkins会报错:oserror: /usr/lib/python2.7/site-packages/lookup3.s ...