转:asmx迷10分钟升级成wcf熟手指南
前言:本文旨在帮助从未接触过wcf(.svc文件)的webservice开发人员,快速将传统的webService/asmx技术迁移到wcf。高手就不用浪费时间往下看了:)
以下所有操作均为vs2010 sp1环境
一、服务物理文件创建方式的变化
1.1 asmx的创建方式
新建项-->Web服务

1.2 wcf的创建方式
新建项-->Wcf服务

二、方法定义上的区别
2.1 asmx中的方法定义

2.2 wcf 中的方法定义
这里先啰嗦一下,默认情况下创建一个wcf服务(比如HelloWorld2.svc文件)后,vs.net会自动创建一个IHelloWorld2.cs的接口,然后HelloWorld2类会实现这个接口。

如果这让您感觉不安,可以大胆的把IHelloWorld2.cs接口删除!然后把HelloWorld2.svc.cs中的代码改成下面这样:

即:
a)在需要暴露的class前加上[ServcieContract]标签
b)在需要暴露的Method前加上[OperationContract]标签
三、客户端服务引用方式的变化
实际开发中,通常service层是一个单独项目,而调用service的是另一个项目,所以我们再创建一个Web Application(或WebSite),以充当调用服务器的客户端应用
3.1 asmx引用方式
右击"添加服务引用",会出来一个对话框

如果您用习惯了vs.net2008的"添加服务引用",对这个界面可能会感觉很陌生,没关系,vs2010允许您找回旧时熟悉的感觉,继续点击"高级"

继续点击"添加服务引用",下面这个界面应该再熟悉不过了吧   
点击"此解决方案中的Web服务",选择HelloWorld.asmx,Web引用名填写成"YJM"(当然也可以自己随便写)

点击"添加引用"完事,完了以后,在vs2010中与vs2008有一些区别:
在vs2010中web.config中会变成
<applicationSettings>
<WebClient.Properties.Settings>
<setting name="WebClient_YJM_HelloWorld" serializeAs="String">
<value>http://localhost:3538/HelloWorld.asmx</value>
</setting>
</WebClient.Properties.Settings>
</applicationSettings>
而vs2008添加服务引用后,是类似
<appSettings>
<add key="YJM.HelloWorld" value="http://localhost:3538/HelloWorld.asmx"/>
</appSettings>
注:部署到生产环境后,只要修改配置文件中的 http://localhost:3538/HelloWorld.asmx 即可实现webservice url的动态调整.(当然如果要在运行时动态指定url,就要代码处理了,后面的示例代码会给出方法)
3.2 wcf 引用方式
右击"添加服务引用",点击"发现"

选择HelloWorld2.svc,命名空间填写"YJM2"(当然也能是其它名字)

点击“确定”完成,web.config中会多出一节内容:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_HelloWorld2" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:3538/HelloWorld2.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_HelloWorld2" contract="YJM2.HelloWorld2"
name="BasicHttpBinding_HelloWorld2" />
</client>
</system.serviceModel>
注:部署到生产环境后,只要修改配置文件中的 http://localhost:3538/HelloWorld2.svc 即可实现wcf url的动态调整.
四、客户端调用代码的变化
这部分太简单了,直接上代码吧
using System;
using WebClient.YJM;
using WebClient.YJM2; namespace WebClient
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
#region asmx/webservice调用示例
using (HelloWorld ws = new HelloWorld())
{
//System.Diagnostics.Debug.WriteLine(ws.Url);
//System.Diagnostics.Debug.WriteLine(Properties.Settings.Default.WebClient_YJM_HelloWorld);
//ws.Url = "http://www.youWeb.com/xxx.asmx"; //如果需要动态切换asmx的地址,这一行代码就给出了方法
string result = ws.Hello("client_asmx");
Response.Write("asmx call:" + result + "
");
}
#endregion #region svc/wcf 调用示例
using (HelloWorld2Client client = new HelloWorld2Client())
{
//System.Diagnostics.Debug.Write(client.Endpoint.ListenUri.ToString());
//client.Endpoint.ListenUri = new Uri("http://www.youWeb.com/xxx.svc");//如果需要动态切换svc的地址,这一行代码就给出了方法
string result = client.Hello("client_wcf");
Response.Write("wcf call:" + result + "
");
}
#endregion
}
}
}
运行结果:

示例源码下载:http://files.cnblogs.com/yjmyzz/asmx_update_to_wcf.zip
相信有webservice经验的同学们,看完本篇,已经能顺利升级到wcf了。当然wcf深究下去,远不止本文所写的这么简单,这门技术水还是相当深的,强烈推荐多看看园子里http://www.cnblogs.com/artech/ 的文章,他是园子里(甚至可以说是国内) 我心目中的 wcf第一人,多去看看,必有收获。
转:asmx迷10分钟升级成wcf熟手指南的更多相关文章
- 10分钟精通SharePoint - SharePoint升级
		类型: b2b(安装更新)和v2v(跨版本升级) 内容:二进制文件和数据库 过程: 升级前检查 - 检查场内数据,配置和自定义等等 升级准备和计划 - 根据需要和升级检查制定相应计划和准备工作 ... 
- 10分钟精通SharePoint - SharePoint安装
		简介 接触SharePoint就避免不了要接触SharePoint安装,无论你是对SharePoint进行开发还是管理(终端用户除外).SharePoint的安装涉及到两部分:预装.安装和配置,这主要 ... 
- 【转】让你10分钟搞定Mac--最简单快速的虚拟安装
		文章出处:让你10分钟搞定Mac--最简单快速的虚拟安装http://bbs.itheima.com/thread-106643-1-1.html (出处: 黑马程序员训练营论坛) 首先说明一下. 第 ... 
- [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则
		转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ... 
- 在net中json序列化与反序列化    面向对象六大原则   (第一篇) 一步一步带你了解linq to Object    10分钟浅谈泛型协变与逆变
		在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ... 
- 10分钟彻底理解Redis持久化和主从复制
		在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制. 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中, ... 
- 10分钟梳理MySQL核心知识点
		数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 做业务,要懂基本的SQL语句:做性能优化,要懂索引,懂引擎:做分库分表,要懂主从,懂读写分离... 今天我们用10分钟,重 ... 
- JavaScript 10分钟入门
		JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ... 
- emacs最简单入门,只要10分钟
		macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ... 
随机推荐
- H5+ and mui学习记录
			基础 1.H5+ 定义实现了一些调用原生方法的对象 2.其他的原生方法可以通过Native.js调用 webview 3.webview是调用原生界面的H5+对象 4.单个webview只承载单个页面 ... 
- ios滤镜
			现在很多滤镜效果都写好了,搬运工的我直接拿来用(感谢 
- springmvc web应用程序 java
			搭建普通 springmvc 1.如图建立相关文件 建立在WEB-INF下比较安全,不能直接访问资源. 2.建立Controller控制器,如图 3.需要导入的jar包 commons-logging ... 
- poj 3710 Christmas Game 博弈论
			思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ... 
- poj 1797(最短路变形)
			题目链接:http://poj.org/problem?id=1797 思路:题目意思很简单,n个顶点,m条路,每条路上都有最大载重限制,问1->n最大载重量.其实就是一最短路的变形,定义wei ... 
- Mysql笔记——DDL
			数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言.一个数据库模式包含该数据库中所有实体的描述定义. =========== ... 
- wordpress自定义栏目
			开启自定义栏目:点击头顶的“显示选项”,勾选“自定义栏目” 然后编辑文章时,即可看见 实验: 定义名称为:play_url ,值为:http://www.xiami.com/widget/635357 ... 
- YII2 RBAC Admin User权限相关
			https://github.com/mdmsoft/yii2-admin/blob/master/docs/guide/configuration.md http://www.liuhaihua.c ... 
- Phalanx--hdu2859(dp 最大对称子图)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题意就是给你一个n*n的字符矩阵,从中选出一个最大的子矩阵(m*m)满足关于斜对角线(左下角到右 ... 
- Java:Collection集合类
			特点:只能用于存储对象,集合长度时可变的,集合可以存储不同类型的对象. 数组和集合类同时容器,不同的是: 1.数组虽然也可以存储对象,但是长度是固定的:集合长度时可变的. 2.数组中可以存储基本数据类 ... 
