现代定义的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调用的更多相关文章

  1. webservice调用和生成

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  2. 使用自定义签名的https的ssl安全问题解决和metro的webservice调用

    最近一直在忙新的项目,每天加班到8点多,都没来写博客了.新的项目遇到了很多问题,现在趁着突然停电来记录下调用https的问题吧. 我们服务主要是,我们调用数据源数据,并且再提供接口供外部数据调用. 我 ...

  3. C#动态webservice调用接口 (JAVA,C#)

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...

  4. WebService 调用

    一.WebService调用 1.webservice支持四种调用方式:SOAP 1.1,SOAP 1.2,GET,POST.           2.如果要webservice支持GET,POST调 ...

  5. 使用XmlInclude解决WebService调用时无法识别子类的异常

    一.定义抽象类及子类,WebMethod实际返回子类参数 //使用XmlInclude解决WebService调用时无法识别子类的异常 [System.Xml.Serialization.XmlInc ...

  6. WebService调用一对多关联关系时出现 死循环:A cycle is detected in...

    通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...

  7. C# ASP.NET Webservice调用外部exe无效的解决方法

    最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决 ...

  8. 【技术贴】webservice 调用 Transport error : 401 Error:Una

    解决 webservice 调用之后报错:调用异常:Transport error : 401 Error:Unauthorized 授权失败. 加入如下代码 //Sap需要ws-security的认 ...

  9. WebService调用1(.Net)

    1.创建一个最简单的Web Service (1)  新建-项目-ASP.NET空WEB应用程序 (2)添加新项-WEB服务 默认会添加一个HelloWorld方法: using System; us ...

随机推荐

  1. Ajax省市地区下拉列表三级联动

    SQL数据库表 --创建Province表 CREATE TABLE [dbo].[Province]( [Id] [int] NULL, [Name] [varchar](50) NULL, [or ...

  2. 如何使用jQuery写一个jQuery插件

    jQuery插件其实是前端框架的思维,构成一个框架,个人认为必须满足以下几个基础条件:1. 可重用,2. 兼容性,3. 维护方便,虽说现在有很多比较成熟的前端框架,但是也有部分存在配置麻烦,学习成本大 ...

  3. leetcode 42. 接雨水 JAVA

    题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...

  4. python设计模式-适配器

    定义: 将一个接口转换为客户希望的另一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器模式又叫变压器模式,也叫包装模式(Wrapper),它的核心思想是将一个对象经过包装 ...

  5. 【OCP-12c】CUUG最新考试原题整理及答案(071-9)

    9.(5-5) choose the best answerView the Exhibit and examine the structure of the SALES and STORES tab ...

  6. scroll滚动到一定距离触发事件/返回顶部animate

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. is 与 == 的区别;小数据池; 编码与解码

    1, is 与 == 的区别 ==  比较的是两边的值 is   比较的是两边的地址  id () 2,小数据池(在终端中) 数字小数据池的范围 -5 ~ 256 字符串中如果有特殊字符他们的内存地址 ...

  8. [ActionScript 3.0] 使用Embed在类中嵌入字体

    package { import flash.display.Sprite; import flash.text.Font; import flash.text.TextField; import f ...

  9. UITouch笔记

    UITouch是什么 表示在在屏幕上触摸事件,包括触摸的位置.大小.力度(3D touch).运动. 在一系列触摸事件中,UITouch都是同一个,但是不要retain某一个UITouch.如果要保存 ...

  10. java高并发测试代码

    package com.example.test; import java.net.URL;import java.net.URLConnection;import java.util.concurr ...