标准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 ...
随机推荐
- c#用表达式树实现深拷贝功能
因为对表达式树有点兴趣,出于练手的目的,试着写了一个深拷贝的工具库.支持.net standard2.0或.net framework4.5及以上. GitHub地址https://github.co ...
- python学习之路 六 :装饰器
本节重点: 掌握装饰器相关知识 python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函 ...
- link和@import的区别是什么 ?
1.link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务:@import属于CSS范畴,只能加载CSS. 2.link引入CSS是,在页面载入时间同时加载:@import页面网页完全 ...
- logstash--使用ngxlog收集windows日志
收集流程 1nxlog => 2logstash => 3elasticsearch 1. nxlog 使用模块 im_file 收集日志文件,开启位置记录功能 2. nxlog 使用模块 ...
- chrome cpu占用100%
参考原文地址:https://stackoverflow.com/questions/20276097/chrome-devtools-100-cpu 问题描述,chrome打开devtools开发者 ...
- BUAA_OO_homworkone包含三角函数的多项式求导
第一次作业 基于x的简单多项式相加求导 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16>.19260817等. 幂函数 一般形式 由自变量x和指数组成,指数为一个带符号整数 ...
- CSS 两个行内块元素,宽度相加刚好等于父盒子容器的元素,但第二个元素掉在第二行解决办法
我们可以发现:两个行内块元素,宽度相加刚好等于父盒子容器的元素,但第二个元素掉在第二行,这是什么问题呢? 我们先来看一下效果: <!DOCTYPE html> <html lang= ...
- jvm内存分部
首先我们必须要知道的是 Java 是跨平台的.java常用的名词有jdk,jre,jvm jdk包括后两者,是开发者工具集, jre表示java运行环境, jvm是java虚拟机,是java夸平台的保 ...
- 使用百度地图API查地理坐标
在网络编程中,我们会和API打交道.那么,什么是API?如何使用API呢?本文分享了一下我对API的理解以及百度地图API的使用. API是"Application Programming ...
- PHP错误与异常处理
https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html 请一定要注意,没有特殊说明:本例 PHP Version < 7 说起PHP异常处理,大 ...