跟着Artech学习WCF 省的看书没环境没心情尤其没有看书的环境只有上网的环境
Artech的 我的WCF之旅(1):创建一个简单的WCF程序
http://www.cnblogs.com/artech/archive/2007/02/26/656901.html
以前自己练习WCF是总是通过创建客户端代理类和实现所有东西都是放在创建WCF的项目里面,WCF的地址(Address),绑定(Binding),契约(Contract)
自然也是都在创建 WCF的项目里面,然后客户端创建代理里是调用,觉得真是方便啊,这玩应我看也不用学了 ,和以前的没啥区别,结果看公司的项目的WCF部分和调用WCF部分时, 彻底傻眼,找了N旧都没找见地址(Address),绑定(Binding),契约(Contract),这也没什么,问题是线上的某个WCF总是在某个关键的时刻出问题【例如某NB领导莅临指导检查】事后查看服务器日志 看了半天没搞明白 因为以前的东西没说这个东西会出这样的错误啊 才发现这个东西的确是要学的啊 在WCF上还是菜鸟啊 问题是 公司以后的项目方向是mvc+wcf啊 菜鸟不能不学啊
Artech 的WCF之旅 除了代码不能复制过来之外 我看很适合学习啊 尤其没有看书的环境只有上网的环境
我练习的项目结构
首先是WCF的 C 契约(Contract) 是个接口类,这个类可以放在WCF项目里面也可以不放在WCF里面 大多数情况,都是单独拿出来,给server和client调用,所以我们还是拿出来吧,例如我的Contracts类库中的ICalculator.cs 代码如下
[ServiceContract] public interface ICalculator { [OperationContract] string add(double x,double y); }
注意啊Contracts.ICalculator 在WCFserver和Client的配置文件中是要用的 例如
<!-- Service Endpoints WCF服务器端--> <endpoint address="" binding="wsHttpBinding" contract="Contracts.ICalculator">
<!-- clent Endpoints 客户端调用 --> <endpoint name="calculatorservice" binding="wsHttpBinding" address=http://localhost:25362/Service1.svc
contract="Contracts.ICalculator" >
WCF的c就是这个样子 另外在实现服务接口时我们总是这样
public class CalculatorService:ICalculator 这样可以生成一些代码,看的多了,
总以为必须显示的:ICalculator ,但问题是其他部门的接口只一书面形式
写好了 还没有类库 好焦急啊 其实 这要把每个接口的每个方法都实现了:ICalculator 是可以去掉不用的
WCF宿主就简单多了创建一个WCF项目 然后按照教程写就行了 配置文件要注意一下contract这个属性是你的接口
所在的地方
<!-- Service Endpoints WCF服务器端--> <endpoint address="" binding="wsHttpBinding" contract="Contracts.ICalculator">
MVC调用WCF以前很傻很天真以为可以到处创建代理类,其实项目中用的多的是动态生成的
代码如下
public ActionResult Index() { string result = ""; using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice")) { ICalculator proxy = channelFactory.CreateChannel(); using (proxy as IDisposable) { result = proxy.add(2, 3); } } ViewData["Message"] = "mywcf"+result; return View(); }
配置文件中如下配置
<system.serviceModel> <client> <!-- clent Endpoints 客户端调用 --> <endpoint name="calculatorservice" binding="wsHttpBinding"
address=http://localhost:25362/Service1.svc
contract="Contracts.ICalculator" > </endpoint> </client> </system.serviceModel>
注意 name="calculatorservice" 是一个名称例如你可以调用N个WCF服务那第N个的名字就是calculatorserviceN
WCF返回什么好呢?实体对象吗?NO 用的最多的是格式化的XML,这样别人想怎么用就怎么用
啊第一个教程马马虎虎看完了