Silverlight+WCF 新手实例 象棋 WCF通讯基础(十四)

简介:

从此节开始,我们要开始WCF通讯了。

本游戏的只是基于WCF最基础的应用,没有WCF深奥的知识,相关的深奥知识请关注专业的WCF系列文章。

我们先来实现一个Silverlight里调用Hellow的尝试:

我们新建一个新的Silverlight应用程序:文件->新建->项目->Silverlight应用程序->Hellow

建立后就一个Hellow应用程序和一个Helow.web的Web应用程序。

 

一:我们将WCF集成在Web应用程序中

我们对着Web应用程序右键-》添加->新建项->WCF服务-》起名:Service.svc

回车后,默认生成IService.cs接口和Service.svc/Service.svc.cs文件

我们看一下自动生成的代码:

复制代码
 [ServiceContract]
    
public   interface  IService
    {
        [OperationContract]
        
void  DoWork();

        [OperationContract]
        
string  SayHello( string  name); // 这个是我加的
    }
复制代码

 

看下代码分析:

接口标识:[ServiceContract],

接口头顶上多了一个特性,翻译一下就叫“服务契约”,当初刚看WCF的webcast时,一听契约,迷糊了,这名字也扩鬼义了。

方法名标识:[OperationContract]

 

其实就是一些特性,用于微软内部反射的一个标识,看见不同名称干点不同的事。

当然了,除了接口,方法,还有实体类,和成员标识:

实体类契约:[DataContract]--有点神奇的是,我刚发现我的实体类里有一个忘了写这个,竟然也一直成功的运行到现在。

属性:[DataMember]

复制代码
     ///   <summary>
    
///  游戏玩家
    
///   </summary>
    [DataContract]
    
public   class  Player
    {
        
///   <summary>
        
///  玩家ID
        
///   </summary>
        [DataMember]
        
public  Guid ID
        {
            
get ;
            
set ;
        }
    }
复制代码

 

OK,现在我们回去实现上面我新加的那个SayHello接口方法,其实就是返回“Hello:加名字“;

复制代码
  public   class  Service : IService
    {
        
public   void  DoWork()
        {

        }

        
#region  IService 成员


        
public   string  SayHello( string  name)
        {
            
return   " Hello: "   +  name;
        }

        
#endregion
    }
复制代码

 

好了,WCF的代码到此就写完了,和webservice差不多吧,既然差不多,那就用和webservice一样,我们到Silverlight应用程序中引用这个WCF。

对着Silverlight的“引用”右键-》添加服务引用-》出来对话框后点"发现(D)":

再点一下那个Service。svc,出来看见那个Service和IService就说明正确了。

接着我们改下命名空间,改成HellowService。

确认之后,自动生成Service References文件夹及ServiceReferences.ClientConfig文件。

接下来,我们要开始调用WCF的方法了。

回到Silverlight应用程序的MainPage里,拉入一个TextBox,一个TextBlock,一个button

 

复制代码
< Grid x:Name = " LayoutRoot "  Background = " White " >
        
< Button Content = " WCF 调用 "  Height = " 23 "  HorizontalAlignment = " Left "  Margin = " 84,111,0,0 "  Name = " btnCallWCF "  VerticalAlignment = " Top "  Width = " 75 "  Click = " btnCallWCF_Click "   />
        
< TextBox Height = " 23 "  HorizontalAlignment = " Left "  Margin = " 84,71,0,0 "  Name = " txtName "  VerticalAlignment = " Top "  Width = " 120 "   />
        
< TextBlock Height = " 23 "  HorizontalAlignment = " Left "  Margin = " 228,71,0,0 "  Name = " tbMsg "  Text = " 显示的内容 "  VerticalAlignment = " Top "   />
    
</ Grid >
复制代码

 

改完几个Name之后,双击Button进去事件。敲入以下代码:

复制代码
private   void  btnCallWCF_Click( object  sender, RoutedEventArgs e)
        {
            Binding binding 
=   new  BasicHttpBinding();
            EndpointAddress endPoint 
=   new  EndpointAddress( " http://localhost:12345/Service.svc " );
            HellowService.ServiceClient client 
=   new  HellowService.ServiceClient(binding, endPoint);
            client.SayHelloCompleted 
+=   new  EventHandler < HellowService.SayHelloCompletedEventArgs > (client_SayHelloCompleted);
            client.SayHelloAsync(txtName.Text);
        }

        
void  client_SayHelloCompleted( object  sender, HellowService.SayHelloCompletedEventArgs e)
        {
            tbMsg.Text 
=  e.Result;
        }
复制代码

 

这里说一下:

第一行:Binding binding =new BasicHttpBinding(); --》绑定通讯方式,这里是BasicHttp方式,基础的http请求方式。像这一类的方式有N种,10种左右。说明微软的支持是相当的强大的。

第二行:EndpointAddress endPoint = new EndpointAddress("http://localhost:12345/Service.svc");--》指定SVC的路径,要不然找不到路径调用了。这里我们用了固定端口12345。

如果要固定端口,这里需要配置一下Hellow.Web项目的属性:

然后打开ServiceReferences.ClientConfig,把特定端口号也改成12345。

第三行:调用方法完成后的回调事件

第四行,异步调用SayHello方法。

说明:所有WCF的方法调用都是异步的,所以总是伴有回调函数。

对于WCF,用的最多的就是事件和委托了,这两点不熟悉的大伙子们,要赶紧补补课啦。

一切就绪,F5运行,出来如下窗口:

输入名称:路过秋天,点击调用,正常回来消息了。

说明,第一步的WCF调用已经成功了。

 大伙在试的时候要悠着点,不然很容易就出现各种各样的问题

下节我们讲将WCF独立出来一个项目,不放在Hellow.Web上,由于独立出来,所以会用另一个端口,

对于端口不同产生的跨域问题,也顺手解决。

这里提供源下载:点击下载


版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/archive/2010/07/12/1775864.html

目录
打赏
0
0
0
0
52
分享
相关文章
.net WCF简单实例
  最近看到网上招聘有许多都需要WCF技术的人员,我之前一直没接触过这个东西,以后工作中难免会遇到,所谓笨鸟先飞,于是我就一探究竟,便有了这边文章。由于是初学WCF没有深入研究其原理,只是写了一个demo留着以后,如果哪里写的不对希望大佬们能指出批评。
1082 0
wcf双工通讯
首先说一个服务引用不成功的解决办法: 需要把服务端配置文件中的Binding换成: 或: 下面是一个wcf的简单示例: 服务契约代码: using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IUser”。
1011 0
使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题: 1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。
1256 0
Wcf通讯基础框架方案(六)解决方案说明以及源代码
源代码见 http://wcfextension.codeplex.com/ 注意: 1) 本来没打算这么早开源,这只是一个比较原始的实现,请勿直接在商业环境使用 2) 请注意本框架的授权条款Apache License 2.
707 0
Wcf通讯基础框架方案(一)——基本结构
由于希望使用Wcf作为公司内的通讯框架,因此基于Wcf进行了一些扩展,主要的目的有以下几个方面: 1) 希望减少客户端调用的复杂度,调用方式简化为WcfServiceLocator.Create().Add(1,2)。
813 0
Wcf通讯基础框架方案(二)——集中配置
从这次开始在几个方面简单阐述一下实现,集中配置是这个框架很大的一个目的,首先在数据库中会有这么一些表: 其实可以看到这些表的结构,应该是和配置节点中的层次有对应的 1) Service表描述的是服务,主要保存服务行为以及服务的配置。
602 0