[转载]c# WebService调用的三大难题

记一次webservice性能调优经历(c#) 项目背景 和一个app做对接,提供一套业务接口给对方调用,每一个功能码对应一个方法,一个业务操作,并且需要记录请求体和响应体的日志,便于问题的排查,于是一个webservice诞生了,这个webservice 通过每个功能码对应一个类,然后通过反射方法,传入功能码实例话对应的类,去对请求做出响应; 先介绍下两个测试webservice的方法 1、接口测试工具:soapui,这个是经常拿来测试we... 阅读详情

一、用C#实现WebService是相当简单的事情,我们只要创建一个Web服务程序,在方法名上面加上[WebMethod],部署到IIS上,就能像访问Web站点一样访问WebService。

用C#编写客户端时,只需要将WebService添加到引用,就能像调用本地方法一样去C# WebService调用。像这样的例子也比比皆是,在这就不多讲。

二、用C++实现WebService,一般会用到gsoap,具体方法见:http://www.cppblog.com/qiujian5628/archive/2008/06/19/54019.html

三、当做完了这些之后,并不代表WebService就能相互通讯了,现在我简单列举一下问题:

1、C#提供的WebService的URL一般形如:http://localhost/WebService.asmx,但是,C++能提供的只能是:http://localhost/。C++做客户端的时候调用没有问题,但是当C#做客户端的时候,引用C++提供的RUL时,会提示没用执行方法(HTTP GET method not implemented)。做C#开发的大部分会认为C++方提供的不是WebService,或者说提供的WebService根本就不全,都不带.asmx文件。做C++开发的会认为他传输的数据符合soap协议,靠http传输数据,他就是WebService。

2、当我们解决了第一步后,紧接着会发现另外一个问题。当我们需要传输自定义数据类型时(在C++中称结构体,在C#中称实体),从C++返回的信息中,C#无法构建出实体类。

3、当传输的信息中带有中文字符时,乱码满天飞。

四、为了解决这些问题,我们先简单了解一下WebService。

Web Service互操作协议栈:

〈A〉、服务发现 (UDDI)

〈B〉、服务描述(WSDL)

〈C〉、服务调用(SOAP)

〈D〉、消息编码 (XML)

〈E〉、传输网络层(HTTP, TCP/IP)

其中WSDL描述WebService都有什么方法、方法有什么参数,什么返回值等。SOAP(简单对象访问协议(Simple Object Access Protocol)是一种轻量的、简单的、基于XML的协议。传输的数据就需要遵循这个协议。我比较简单得认为传输的数据需要遵循这种格式。

借用微软的这个图描述下WebService的调用过程:

C# WebService调用

五、开始解决问题。作为.NET开发人员,我们根本就接触不到底层的东西,全被封装了。

C++做的确实是WebService,只是他们需要给提供一个描述文档,即.WSDL文件。使用.NET提供的wsdl.exe工具,使用命令:wsdl /o: c:/webservice.cs c:/webservice.wsdl。通过webservice.wsdl文档,生成代理类,将代理类写入webservice.cs文件中。我们拷贝这个cs文件到项目中,将URL指向http://localhost/,就能像以往那样使用WebService了。

当出现无法传递复杂类型数据时,是因为使用gsoap生成的wsdl文件与.Net中生成的wsdl文件不一样。具体代码如下:

 
  1. 〈!--operationresponseelement--〉
  2. 〈elementname="result"〉
  3. 〈complexType〉
  4. 〈sequence〉
  5. 〈elementname="a"type="xsd:int"
  6. minOccurs="1"maxOccurs="1"/〉
  7. 〈elementname="b"type="xsd:int"
  8. minOccurs="1"maxOccurs="1"/〉
  9. 〈/sequence〉
  10. 〈/complexType〉
  11. 〈/element〉
  12. 以上为gsoap生成的。返回实体result,
  13. 实体有两个属性:a,b。
  14. 〈s:elementname="TestResponse"〉
  15. 〈s:complexType〉
  16. 〈s:sequence〉
  17. 〈s:elementminOccurs="0"maxOccurs="1"
  18. name="TestResult"type="tns:result"/〉
  19. 〈/s:sequence〉
  20. 〈/s:complexType〉
  21. 〈/s:element〉
  22. 〈s:complexTypename="result"〉
  23. 〈s:sequence〉
  24. 〈s:elementminOccurs="1"maxOccurs="1"
  25. name="a"type="s:int"/〉
  26. 〈s:elementminOccurs="1"maxOccurs="1"
  27. name="b"type="s:int"/〉
  28. 〈/s:sequence〉
  29. 〈/s:complexType〉
  30. 以上是.NET生成的。
  31. 在下面的文件中,多出
  32. 〈s:elementname="TestResponse"〉
  33. 〈s:complexType〉
  34. 〈s:sequence〉
  35. 〈s:elementminOccurs="0"maxOccurs="1"
  36. name="TestResult"type="tns:result"/〉
  37. 〈/s:sequence〉
  38. 〈/s:complexType〉
  39. 〈/s:element〉

这个便是.NET中用来构造实体的。当我们出现情况4.2时,gsoap中尽量使用.NET生成的wsdl文档,生成.h文件,以避免C++中的结构无法在C#中转换成实体。

第三个问题,我们是通过将中文转换成16进制后传输过来,然后再转换成中文。下面提供C#转换的代码:

 
  1. ///〈 summary 〉
  2. ///从16进制转换成汉字
  3. ///〈 /summary 〉
  4. ///〈 paramname="hex" 〉〈 /param 〉
  5. ///〈 returns 〉〈 /returns 〉
  6. publicstaticstringGetChsFromHex(stringhex)
  7. {
  8. if(hex==null)
  9. thrownewArgumentNullException("hex");
  10. if(hex.Length%2!=0)
  11. {
  12. hex+="20";//空格
  13. //thrownewArgumentException
  14. ("hexisnotavalidnumber!","hex");
  15. }
  16. //需要将hex转换成byte数组。
  17. byte[]bytes=newbyte[hex.Length/2];
  18. for(inti=0;i〈 bytes.Length;i++)
  19. {
  20. try
  21. {
  22. //每两个字符是一个byte。
  23. bytes[i]=byte.Parse(hex.Substring(i*2,2),
  24. System.Globalization.NumberStyles.HexNumber);
  25. }
  26. catch
  27. {
  28. //Rethrowanexceptionwithcustommessage.
  29. thrownewArgumentException("
  30. hexisnotavalidhexnumber!","hex");
  31. }
  32. }
  33. //获得GB2312,ChineseSimplified。
  34. System.Text.Encodingchs=System.Text.Encoding.
  35. GetEncoding("gb2312");
  36. returnchs.GetString(bytes);
  37. }
  38. ///〈 summary 〉
  39. ///从汉字转换到16进制
  40. ///〈 /summary 〉
  41. ///〈 paramname="s" 〉〈 /param 〉
  42. ///〈 returns 〉〈 /returns 〉
  43. publicstaticstringGetHexFromChs(strings)
  44. {
  45. if((s.Length%2)!=0)
  46. {
  47. s+="";//空格
  48. //thrownewArgumentException("
  49. sisnotvalidchinesestring!");
  50. }
  51. System.Text.Encodingchs=System.Text.
  52. Encoding.GetEncoding("gb2312");
  53. byte[]bytes=chs.GetBytes(s);
  54. stringstr="";
  55. for(inti=0;i〈 bytes.Length;i++)
  56. {
  57. str+=string.Format("{0:X}",bytes[i]);
  58. }
  59. returnstr;
  60. }

注:以上来转换代码源于网络,C++中转换的代码也可以在网上找到,C++与C# WebService调用经过以上的步骤就能基本实现。

三大难题到此结束,其实在整个过程中还有个最大的难题,那就是人与人的交流。因为一方使用C++,一方使用C#,语言不同,各自想问题的方式也不一样,所以需要相互理解,相互站在对方的角度想问题。多交流、多沟通才是解决问题之道。请不要抱怨C#弱智,也请不要怪C++繁琐,语言既然存在则有他的价值。

原文链接:http://hi.baidu.com/luzhichen/blog/item/8c0aea72f9dfac118601b066.html

记一次WebService调用踩的坑 问题描述:由于公司最近引进了某公司A的网络管理软件,需要使用A提供的WebService接口。 遇到问题如下: 1、接口文档不规范。WebSerivce 接口有安全性校验要求,需要在 SOAP 头部增加相应的用户名和密码作为安全配置。 2、依赖冲突、Bug等 解决方法: 1、、拿到接口肯定是先测试,看能不能通,我也是这么干的,然,以前没使用过WebService (工作一年见的少)都是使用Rest... 阅读详情

相关推荐

C# 创建、部署和调用WebService的简单示例

webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子。这里我用的是Visual Studio 2015开发工具。 首先创建一个空的Web应用程序。 然后鼠标右键点击项目,选择 添加>新建项。 选择Web服务,点击添加。一个简单的webservice就创建完成了,接下来编...

weixin_33971977的博客 2651

c# WebService调用的三大难题

一、用C#实现WebService是相当简单的事情,我们只要创建一个Web服务程序,在方法名上面加上[WebMethod],部署到IIS上,就能像访问Web站点一样访问WebService。 用C#编写客户端时,只需要将WebService添加到引用,就能像调用本地方法一样去C# WebService调用。像这样的例子也比比皆是,在这就不多讲。 二、用C++实现WebService,一般会用到...

weixin_30869099的博客 268

Qt+gsoap调用WebService

 版权声明本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。Qt+gsoap调用WebService1.       前言Qt本身给我们提供了调用WebService的解决方案qsoap,看了一下他的介绍,感觉实在是太弱了,而且又是个新出的东西,所以还是决定不用他。

我一路走来--- 2万+

记一次因WebService无响应导致线程阻塞 - 生产问题定位

生产环境因WebService调用无响应导致线程阻塞问题排查

qq_31279701的博客 1844

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

SAP-ML章<<<<第二节:物料账报错处理ABAP编程错误:RAISE_EXCEPTION>>>>

#SAP-ML章<<<<第一节:物料账报错处理ABAP编程错误:RAISE_EXCEPTION>>>> 1.物料账报错提示: ABAP编程错误:RAISE_EXCEPTION ABAP程序:SAPLFCML4H_RUN_PRICES应用组件CO-PC-ACT 2. 物料账报错背景: CKMLCP运行结算时 3. 解决方案: 通过DEBUG查看错误的地方 OKTZ:分析原因为:可能打包或者配置传输时弄错 ...

SAP.David.Gao的博客 1856

解决 C# .NET WebClient WebRequest请求缓慢的问题

解决 C# .NET WebClient WebRequest请求缓慢的问题

wangchaoqi1985的博客 642

告别拼音!用VSCode+Dosbox-X搞定汇编语言课程设计里的中文姓名显示

本文详细介绍了如何利用VSCode和Dosbox-X解决汇编语言课程设计中中文姓名显示的问题。通过配置开发环境、理解GB2312编码及正确使用汇编指令,学生可以告别拼音显示,实现中文字符的正确输出。文章还提供了完整的代码示例和常见问题排查方法,帮助读者快速掌握这一实用技能。

weixin_30872337的博客 424

vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)

我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便。我想能够利用配置文件灵活调用WebService。如何实现呢?用C#通过反射实现动态调用WebService下面是WebService代码: usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.W...

weixin_39737831的博客 428

深度强化学习研究笔记(1)——入门(马尔科夫决策过程,贝尔曼方程,价值迭代和策略迭代)

1. 强化学习(Reinforcement learning)概述 强化学习(Reinforcement learning)的基本内涵是将问题用代理和环境进行建模。其中代理能够对环境执行一些特定的动作a∈Aa \in Aa∈A,从而到达某个状态s∈Ss \in Ss∈S,然后我们就可以根据该状态为代理赋予特定的奖励rrr。强化学习的基本思想如下图所示: 代理的目标是最大化未来的奖励总和,它通过将...

越野者的博客 5280

SQL中的时间计算:员工每日工作时长

摘要:本文介绍了一个使用SQL查询计算员工每日工作时长的实用方法。通过分析包含员工打卡记录的数据库表,利用CTE(公共表表达式)将日期分组,计算最早和最晚打卡时间差,最终以"小时:分钟"格式输出工作时长。该方法适用于每日两次打卡的场景,并提示了处理漏打卡等特殊情况时的注意事项,为企业考勤管理提供了有效的数据支持方案。(148字)

m0_74337424的博客 412

用C#通过反射实现动态调用WebService 告别Web引用(转载)

我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便。我想能够利用配置文件灵活调用WebService。如何实现呢? 用C#通过反射实现动态调用WebService 下面是WebService代码: using System; using System.Collections.Generic; using Sys...

472

Microsoft Bitlocker企业级管理部署方案

BitLocker是Windows 10以及更高版本中内置的磁盘加密工具,是一种可靠的数据保护机制,可以保护计算机上的敏感数据不被未经授权的人访问。BitLocker的工作原理是将整个系统卷或其他数据卷加密的同时,向某个可信软件或硬件模块请求密钥解密数据。BitLocker最大的好处在于其内置于Windows系统,所以用户无需安装其他软件或购买额外的许可证或硬件设备。本文将介绍Microsoft BitLocker企业级管理部署方案,包括:BitLocker部署前的准备工作。

xueyunshengling的博客 2073

C# 动态调用webService

  今日做项目需要用到webservice,就试了试。结果在引用那添加是可以的,但是现在我们那个webservice还没写出来,所以就想用动态调用webservice。所以找了很多资料看了看,也在网上查了查,发现一个不错的方法,所以转载过来。    using System;using System.Web.Services.Description;using System.IO;

zfxinli的专栏 1244

【WLAN】【基础知识】WIFI那些事儿之信道和频谱(涵盖2.4G、5G、6G,全网最全)

- 从事WIFI相关开发或测试工作,经常要和信道、频宽、频率等打交道,本文仅将平时涉及的2.4G、5G、6G的信道、频宽、频率等做一总结。 - 一图胜万言,本文汇总了工作中经常用到的频谱图,保证全网最全!!! - 本博客地址,https://blog.csdn.net/qxhgd,欢迎各位关注,转发请注明出处。

一介草民,只为生活。 1万+

【2026年得物春招算法岗- 4月18日 -第二题- 老张爬山】(题目+思路+Java&C++&Python解析+在线测试)

这篇文章介绍了一个动态规划问题,解决老张在n天内安排爬山计划以最大化愉悦值的问题。题目允许最多k次打破"不能连续两天爬山"的规则限制。 摘要要点: 使用三维动态规划数组dp[i][j][s],表示第i天结束时已用j次机会、当天状态为s(0不爬/1爬)时的最大愉悦值 状态转移考虑两种情况:当天不爬山时取前一天两种状态的最大值;当天爬山时分别处理前一天不爬山和爬山(需消耗机会)的情况 最终结果为考虑所有可能用掉的k次机会后,最后一天两种状态的最大值 提供了Python、Java和C++三种实

m0_73659489的博客 1357

C#中Winform程序调用WebService服务

C#中Winform程序调用WebService方法 1、首先,需要添加WebService的引用 ⑴在需要调用WebService的项目上,点击鼠标右键,选择添加服务引用,进入'添加服务引用'界面 ⑵点击'高级'按钮,进入'服务引用设置'界面 ⑶点击'添加Web引用'按钮,进入'添加Web引用'界面 ①在'URL'文本框中,填写需要引用的WebService的地址(例如:...

adeeqe3406的博客 793

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# .Net动态调用webService (转载)

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.IO; using System.Web.Services.Description; using System.CodeDom; using Microsoft.CSh

sinat_15155817的专栏 643

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#调用webservice

1、开发环境。 2、代码地址。 算法的java版本webservice的服务端地址: 项目的C#代码的webservice的客户端地址: 3、webservice的服务端版本。 (1)使用idea新建webservice项目。需要安装好idea2018(版本无所谓),jdk1.8(版本要对),Tomcat(必须有),Git(可以没有,我用它来发布到github),ojdbc6.ja...

weixin_30628801的博客 94

C#调用webservice的三种方法总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34221073的博客 8760

【转载】【转载】【转载】C# 动态调用WebService

动态调用WebService

uiwgi的专栏 401

转载:动态调用WebService(C#)

通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样是使工作简单了,但是却和提供Web服务的URL、方法名、参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制。如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译。在某些情况下,这可能...

146

在Android中调用C#写的WebService(附源代码)

由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章。在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebService当做一个对象使用,利用Vs2010中的代码提示功能就能爽歪歪地把想要的东西全部点出来。在Android调用,麻烦了一点,但是也还好。主要是我们需...

dingliang6815的博客 187

delphi 调用C# webservice

转载自:http://www.cnblogs.com/jdmei520/archive/2009/06/17/1505053.htmlWebservice技术的出现将各种开发技术和语言完全的融合了,下面就这种融合在C#和delphi之间的交互做一次全面的体现1.使用C#创建一个Webservice服务。 使用vs2005的模板创建C#的webservice非常容易。原文件如下: [WebS

一刀日记 1609

一个php创建webservice,并通过c#调用的真实实例(转)

https://www.cnblogs.com/sequh/archive/2015/09/18/4819832.html 最近需要用php创建webservice供C#和JAVA来调用,通过3天的搜索和尝试,终于成功在C#下调用,JAVA的调用还没开始,为防止忘记,在这里记录下来全过程。 本文参考了许多文章,文中也采用了其中的示例。 本文目录如下 一、php创建webservice...

weixin_30443747的博客 250
上一篇: 破解WIN2K、XP、2003密码记录
下一篇: PDA端实现动态访问Web Service的方法
barech
博客等级 码龄21年 137粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值