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>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
后台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”结尾的链接。

可以看到是一个xml文件,里面有一个
2.如果是通过soap1.1的协议,可能也会写上这一行代码:myRequest.Headers.Add("SOAPAction", http://tempuri.org/IService1/GetData);
但是这个值是哪里来的呢?[大多数情况下,我们是在调用第三方的web service,看不到对方的源代码]

上图wsdl描述了输入的soapation的值。http://tepuri.org/IService1/GetData。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
因为我这里新建的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
ASP.NET中使用HttpWebRequest调用WCF的更多相关文章
- VS2010中使用Jquery调用Wcf服务读取数据库记录
VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...
- ASP.NET中前台如何调用后台变量
.Asp.Net中几种相似的标记符号: < %=...%>< %#... %>< % %>< %@ %>解释及用法 答: < %#... %> ...
- 使用HttpWebRequest调用wcf一段代码
public class HttpClass { internal static HttpWebRequest _httpWebRequest; public static void Request( ...
- Asp.Net中的HttpWebRequest类与HttpWebResponse类
相关博文:https://www.cnblogs.com/xu-yi/p/10061342.html 相关博文:https://www.cnblogs.com/zoujinhua/p/11313396 ...
- .NET Core 调用WCF 服务
.NET Core 和ASP.NET Core 已经可以调用WCF 服务. 环境要求: VS2015 Update 2 +VS2015 Tooling + .NET Core SDK 下载地址: ht ...
- 动态调用WCF
最近在做的一个项目中需要动态调用WCF地址,因为有很多终端服务器,而每台终端服务器上都部署一个WCF服务,中央服务器需要不定时调用其中某个或者多个WCF服务执行相关操作,因此添加引用及配置文件配置的方 ...
- ASP.net 中手工调用WS(POST方式)
ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...
- Silverlight中异步调用WCF服务,传入回调函数
以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...
- ajax调用handler,使用HttpWebRequest访问WCF服务
引言 随着手机及移动设备的普及,移动端的应用也进入了热潮.以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号.在移动应用开发中,目前据我所了解到的解决方案有:1. ...
随机推荐
- 【总结】C# 设置委托的机理和简要步骤
[引语]实际上,和Winform打交道的第一天呢,我们就已经接触了委托,例如当双击button产生button1_click,这个呢,是对button1点击事件的处理方法,至于委托和订阅事件,就悄悄的 ...
- 关于CSS3的小知识点之2D变换
transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形 ...
- Mongodb常用命令介绍
查看命令的方式: 1.在shell中运行db.listCommands() 2.在浏览器中访问管理员接口:http://ipaddress:28017/_commands 下面介绍在Mongodb中最 ...
- 常用的107条Javascript
1. document.write( " "); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document- >html- >( ...
- flash小游戏在Kongregate上线——BasketBall Master(篮球大师)
小游戏地址,欢迎上去留言评论.游戏完成度没有达到期望水平,只能算完成了核心玩法吧,一些其他构想来不及实现. BasketBall Master(篮球大师) 这个小游戏很早之前就基本做好了,只因有些细节 ...
- function变量困惑
var name = "The Window"; var object = { name : "My Object", getNameFunc : functi ...
- *HDU 1028 母函数
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 有关JVM配置参数含义
1.参数的含义-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JV ...
- while(cin.eof)出错 poj
zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...
- VS2012 2013 显示查找功能 无法具体定位 解决方法
问题的现象:通过使用 Ctrl + Shift + F 也就是Find In Files功能,使用之后只能显示统计结果,不显示具体行.如下图 regedit 中在注册表中查找:HKEY_CLA ...