ASP.NET中使用HttpWebRequest调用WCF
最近项目需要和第三网站进行数据交换,第三方网站基本都是RESTfull形式的API,但是也有的是Web Service,或者.NET里面的WCF。微软鼓励大家使用WCF替代Web Service。
Web Service技术介绍
Web Service是一个平台独立的,松耦合的,自包含的、基于可编程的Web应用程序,可使用开发的XML数据标准来描述、发布、发现、协调和配置这些应用程序,同时用于开发分布式的互操作的应用程序。
WCF技术介绍
WCF是Web Service的升级版本。WCF是Windows Communication Foundation的缩写。是一个运行库和一组 API,用于创建在服务与客户端之间发送消息的系统。它使用相同的基础结构和 API 来创建应用程序,这些应用程序可与同一计算机系统上或驻留在另一家公司内并通过 Internet 访问的系统上的其他应用程序进行通信。
案例需求:一家汽车租赁公司决定创建一个新的应用程序,用于汽车预定。该租车预定应用程序的创建者知道,应用程序所实现的业务逻辑必须能够让公司内外运行的其他软件访问。因此,他们决定以面向服务的方式来创建此应用程序,并通过定义完善的一组服务,将此应用程序的逻辑公开给其他软件。为了实现这些服务并使之与其他软件进行通信,这一新应用程序将使用 WCF。
【说明】本来想演示调用Web Service,自己的电脑只装vs express for web,也没有安装.net framework3.5,所以只能演示调用WCF。
自动化调用Web CF实例
第1步:创建一个WCF项目,一个空的Web项目,添加一个Default form。
第2步:对于WcfService_Server项目,我们不需要修改任何代码,因为创建的时候自动创建了2个web method。在WcfService_Client的引用文件夹右键,如下图所示,点击“添加服务引用”。
第3步 如果自己项目中WCF服务不是非常多,可以点击“发现”,如果知道WCF项目的发布地址也是可以的。如下图所示:
第4步 点击“确定”之后,你会发现项目中多了一个“Service References”文件夹,如下图所示:
同时Web.config也发生了改变,多了下面这些代码:
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IService1" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:54875/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" /> </client> </system.serviceModel>
后台C#代码调用WCF的实例
try { string param = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <GetData xmlns=""http://tempuri.org/""> <value>123</value> </GetData> </soap:Body> </soap:Envelope>"; byte[] bs = Encoding.UTF8.GetBytes(param); HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://localhost:54875/Service1.svc?wsdl"); myRequest.Method = "POST"; myRequest.ContentType = "text/xml;charset=utf-8"; myRequest.Headers.Add("SOAPAction", "http://tempuri.org/IService1/GetData"); myRequest.ContentLength = bs.Length; using (Stream reqStream = myRequest.GetRequestStream()) { reqStream.Write(bs, 0, bs.Length); } using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse()) { StreamReader mysr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); string responseResult = mysr.ReadToEnd(); Response.Write("结果:" + responseResult); } } //捕获异常 catch(Exception ex) { Response.Write(ex.ToString()); Response.Write(ex.StackTrace); }
程序运行结果截图:
以上代码有2处需要注意的地方:
1.<GetData xmlns=""http://tempuri.org/""> <value>123</value> </GetData>
这里的xmlns一般情况下不是http://tempuri.org/,一般都会是实际公司的网站域名。如果对方也是WCF写的服务端的话,可以进入如下图所示界面,然后点击以”?wsdl”结尾的链接。
2.如果是通过soap1.1的协议,可能也会写上这一行代码:myRequest.Headers.Add("SOAPAction", http://tempuri.org/IService1/GetData);
但是这个值是哪里来的呢?[大多数情况下,我们是在调用第三方的web service,看不到对方的源代码]
上图wsdl描述了输入的soapation的值。http://tepuri.org/IService1/GetData。
因为我这里新建的WCF项目是需要IIS或者Developer server来运行,同时Client端本身也是一个web项目。可以把WCF项目放在IIS里面,或者使用IIS Express进行调试。
参考网址:
1.WCF Web API说再见,继承者ASP.NET Web API
http://www.cnblogs.com/shanyou/archive/2012/03/11/2390672.html
2.什么是WCF? http://msdn.microsoft.com/zh-cn/library/ms731079(v=vs.90).aspx
3.http://www.cnblogs.com/macroxu-1982/archive/2009/12/23/1630415.html
4.http://www.cnblogs.com/lantionzy/archive/2010/05/26/1744826.html
本文基于 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议发布,欢迎转载,演绎,但是必须保留本文的署名liminjun88(包含链接http://www.cnblogs.com/liminjun88/),
且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。