WebService-问题
1、引用问题
在用C#对接webservice的时候,常用的方法是下载vs中引用webservice的地址。然后,new对应的client就可以使用了。但在,实际应用中往往会遇到webservice访问受限,比如政府单位中内网限制。因此,在开发过程中就会遇到引用问题。
解决办法:
1)使用vs自带的命令生成一个webservice类,是由webservice开发方生成的。推荐,最简单的方式。
2)使用Http请求,去拼接要发送的请求数据xml文档。
3)使用反射,反射出webservice类,得到要请求的方法,再去调用。不推荐,如果是服务端有SoapHeader验证,该方法不适用。
下面对这几种方法进行介绍。
public class WebService1 : System.Web.Services.WebService
{
public MyHeader myHeader = new MyHeader();
[SoapHeader("myHeader")]
[WebMethod]
public string HelloWorld(string name, string pwd)
{
if (myHeader.key != "12")
{
return JsonConvert.SerializeObject(new { MsgId = 1, Msg = "用户验证成功" });
}
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pwd))
{
return JsonConvert.SerializeObject(new { MsgId = 0, Msg = "用户名或密码不能为空" });
}
if (name.Equals("admin") && pwd.Equals("admin"))
{
return JsonConvert.SerializeObject(new { UserName = name, XueYuan = "外语学院", ZhuanYe = "英语专业", Email = "123456@qq.com", Phone = "12345678901", MsgId = 1, Msg = "获取成功" }); }
return JsonConvert.SerializeObject(new { MsgId = 0, Msg = "用户名或密码错误" });
}
} public class MyHeader : SoapHeader
{ public string key { get; set; }
public string token { get; set; }
}
2、服务端生成类方式
命令:wsdl.exe /out:D:/Proxy.cs /order http://localhost:2178/Services.asmx?wsdl
其他语言编写的webservice,有的可能没有.asmx,在地址后面加上?wsdl就可以生成了。
把这个命令复制到vs的自带命令行中生成一个类文件。把这个类文件,发给要调用webservice方。调用方,引用Proxy.cs文件,接着就可以使用了。代码如下:
WebService1 webService1 = new WebService1();
MyHeader myHeader = new MyHeader();
myHeader.key = "12";
webService1.MyHeaderValue = myHeader;
Response.Write(webService1.HelloWorld("ad","ad"));
3、Http请求方式
拼接要发送的数据。如下是有SoapHeader和无SoapHeader的数据模板。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:HelloWorld>
<!--Optional:-->
<tem:name>?</tem:name>
<!--Optional:-->
<tem:pwd>?</tem:pwd>
</tem:HelloWorld>
</soapenv:Body>
</soapenv:Envelope> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header>
<tem:MySoapHeader>
<!--Optional:-->
<tem:IN_WSKEY>?</tem:IN_WSKEY>
<!--Optional:-->
<tem:IN_TOKEN>?</tem:IN_TOKEN>
</tem:MySoapHeader>
</soapenv:Header>
<soapenv:Body>
<tem:GetReaderInfo>
<!--Optional:-->
<tem:certNo>?</tem:certNo>
<!--Optional:-->
<tem:password>?</tem:password>
<tem:certType>?</tem:certType>
</tem:GetReaderInfo>
</soapenv:Body>
</soapenv:Envelope>
把占位符替换为对应的数据就可以了。HttpHelper是发送Http请求的工具类。不同的开发语言开发的webservice,对应的要发送的数据可能不太一样,原理是一样的就是发送http的请求。具体数据,可以通过Soap UI接口调试工具查看。
StringBuilder param = new StringBuilder();
param.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">");
param.Append(" <soapenv:Header><tem:Muse65WSSoapHeader><tem:IN_WSKEY>HxxxxG</tem:IN_WSKEY><tem:IN_TOKEN>6A1FCE13565B7BC4</tem:IN_TOKEN></tem:Muse65WSSoapHeader></soapenv:Header>");
param.Append(
"<soapenv:Body><tem:GetReaderInfo><tem:certNo>5807151617</tem:certNo><tem:password>151617</tem:password><tem:certType>2</tem:certType></tem:GetReaderInfo></soapenv:Body>");
param.Append("</soapenv:Envelope>");
HttpHelper httpHelper = new HttpHelper();
httpHelper.SetContentType("text/xml;charset=UTF-8");
httpHelper.SetEncoding(Encoding.UTF8);
string str = httpHelper.HttpPost(url, param.ToString());
string res = "";
using (StringReader stringReader = new StringReader(str.Trim()))
{
using (XmlReader xmlReader = XmlReader.Create(stringReader))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
switch (xmlReader.Name.Trim())
{
case "GetReaderInfoResult":
if (xmlReader.Read())
{
res = xmlReader.Value.Trim();
}
break; default:
break;
} }
}
}
}
4、使用反射
不推荐,并且在使用了SoapHeader的webservice中,这种没找到解决办法,不知道怎么传SoapHeader的值。
具体参考:http://www.cnblogs.com/langhua/p/3344784.html
/// < summary>
/// 动态调用web服务
/// < /summary>
/// < param name="url">WSDL服务地址< /param>
/// < param name="classname">类名< /param>
/// < param name="methodname">方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
public object InvokeWebService(string url, string classname, string methodname, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = CommonServiceHelper.GetWsClassName(url);
}
try
{
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);
//生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider icc = new CSharpCodeProvider();
//设定编译参数
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
//编译代理类
CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
/*
* PropertyInfo propertyInfo = type.GetProperty(propertyname);
* return propertyInfo.GetValue(obj, null);
* */
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
WebService-问题的更多相关文章
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...
- 开始webservice了
一.WebService到底是什么 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用 ...
- Spring WebService入门
Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...
- 浅谈跨域以及WebService对跨域的支持
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- Atitit webservice发现机制 WS-Discovery标准的规范attilax总结
Atitit webservice发现机制 WS-Discovery标准的规范attilax总结 1.1. WS-Discovery标准1 1.2. 一.WS-Discovery1 1.2.1. ...
- java调用CXF WebService接口的两种方式
通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...
- VS2010编写WebService与在IIS的发布<之简单讲解>
工具VS2010,window环境win7 一:Webservice的创建与方法查看调用 1.新建空web应用程序项目 2.新建web服务 3.自动生成 4.直接跑起来,可以看到有2个方法 5.点击H ...
- webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口
webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...
- webService学习之路(二):springMVC集成CXF快速发布webService
继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...
随机推荐
- 练习启动各种浏览器的同时加载插件:Firefox, Chrome, IE
# -*- coding:utf-8 -*-import osimport seleniumfrom selenium import webdriverfrom selenium.webdriver. ...
- python分类
python是一种动态解释性的强类型语言. python下分几个类别,分别是cpython,jypython,ironpython,pypy等等,这些属于不同的解释器,但编写规范只有一个就是pytho ...
- HTML5大纲算法
什么是HTML大纲算法? 大纲算法允许用户代理(user agent)从一个web页面生成一个信息结构目录,让用户对页面有一个快速的概览.类似书籍.PDF.帮助文档等,都有一个清晰的目录结构,用户能方 ...
- Folx种子下载器怎么管理下载任务
对于喜欢追剧的用户来说,同时下载好几部剧是司空见惯的事情.但有时候,有些剧比较好看或者热度比较高时,就会希望优先将其下载下来. 对于使用Folx种子下载器的用户来说,可以结合使用下载列表+最大活动数的 ...
- 两种方式教你搞定在mac中格式化磁盘的问题
mac怎么格式化u盘?想必这是大部分苹果用户都会关心的一个问题.格式化u盘在我们日常工作中算是一个比较常规的操作了.但是在mac中随着系统版本不一样,格式化的方式也略有差别.今天,小编将以Mac OS ...
- redis cluster可用性测试
上一节,我们用三台redis组成了cluster,现在我们停掉一台试试: 比较奇怪的是,在停掉其中一台服务器之前建立的链接仍然可以正常执行命令,当我们断开重连时,命令就都被拒绝了: 关联知识: 什么时 ...
- C中memcpy函数用法
1.函数原型 void *memcpy(void *destin,void *source,unsigned n); 其中, destin代表用于存储复制内容的目标数组,类型强制转换为void*指针. ...
- Beta冲刺随笔——Day_Two
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...
- synchronized的底层原理?
最近更新的XX必备系列适合直接背答案,不深究,不喜勿喷. 你能说简单说一下synchronize吗? 可别真简单一句话就说完了呀~ 参考回答: synchronize是java中的关键字,可以用来修饰 ...
- 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...