替Silverlight4创建网络服务

为Silverlight4创建网络服务

      右击WEB项目,添加Silverlight-enabled WCF Service,我们把服务名称命名为TestService,我们在此服务中添加方法如下:

    public
 class
 TestService
    {
        [OperationContract]
        public DateTime GetServerTime()

        {

            return DateTime.Now;

        }
 
    }

      现在我们添加服务引用,右击Silverlight项目,添加服务引用,找到刚才建立的TestService,并把新建的引用命名为MyWebServer。注意:应先把WEB项目生成一下,要不然无法正确识别新服务。  当你创建一个服务引用后,VS将为我们创建一个代理类,一个可以与Webservice交互的类,名称是:Service名称+Client。例如我们上面的服务引用将为我们创建一个TestServiceClient类,在这个类中,我们可以使用定制的方法。

      OK,现在我们开始使用新创建的服务。首先在cs中添加名称空间,如下:

using
 SilverlightApplication3.MyWebServer;      //我的应用程序名为SilverlightApplication3

      在Silverlight中,所有的WebServcie必须以异步的方式进行访问,原理是:你Call一个方法,此时你的应用程序可以继续干其他事情, 例如进行界面上的操作,当执行的结果返回后,它将触发一个事件来执行MethodNameCompleted方法,我们的方法就是 GetServerTimeCompleted。代码如下:

public
 MainPage()
        {
            InitializeComponent();
            TestServiceClient proxy = new
 TestServiceClient();
            proxy.GetServerTimeCompleted += new
 EventHandler<GetServerTimeCompletedEventArgs>(proxy_GetServerTimeCompleted);
            proxy.GetServerTimeAsync();   //异步执行。
        }

        void
 proxy_GetServerTimeCompleted(object
 sender, GetServerTimeCompletedEventArgs e)
        {
            try

            {
                label1.Content = e.Result.ToLongTimeString();
            }
            catch
 (Exception err)
            {
                label1.Content = "
获取服务数据失败
"
;
            } 
        }

      默认情况下,服务等待时间是1分钟,即1分钟后如果服务没有相应(服务器当机、或网络不顺畅),方法将会终止,但你可以自己设置相应时间,代码如下:

proxy.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(30
);

      我们再考虑一个问题,现在的WEB服务地址是什么样子,如果是绝对地址,那么我们今后发布程序时就会遇到很大不便,因为这个服务地址是开发时用的绝对地 址,今后在配置到服务器上时,由于IP地址的改变,我们还需修改它。有经验的开发人员这时一定会考虑用相对地址,是的,我们现在做的工作就是这个。修改代 码如下:

EndpointAddress address = new
 EndpointAddress("
http://localhost:
"
 + HtmlPage.Document.DocumentUri.Port + "
/TestService.svc
"
);
TestServiceClient proxy = new
 TestServiceClient();
proxy.Endpoint.Address = address;

      我们看上面的代码第一行,如果Silverlight应用程序和网站在一个服务器中,那么OK,端口号自动获取了。当然,需要加两个名称空间:

using
 System.ServiceModel;
using
 System.Windows.Browser;

      接下来,我们又要考虑一个问题,如果提供Service的服务器很忙,我们如何提供一个友好界面来提示用户“服务器现在忙”,带着问题我们开始下面的工作。

      要实现这个功能,我们需要一个BusyIndicator控件,而这个控件在Toolkit中,如果你还没有安装,那就赶快上下载吧 http://silverlight.codeplex.com,安装好后,在工具栏就可以看见它,把这个控件放到页面的恰当位置,名称属性设为 busy,

<toolkit:BusyIndicator  Name="
busy
"
 VerticalAlignment="
Top
"
 Width="
100
"
 BusyContent="
正在连接服务器...
"
 />

之后在代码中加入下面的代码:

busy.IsBusy = true
; 
proxy.GetServerTimeCompleted += new
 EventHandler<GetServerTimeCompletedEventArgs>(proxy_GetServerTimeCompleted);
proxy.GetServerTimeAsync();
try

{
       label1.Content = e.Result.ToLongTimeString();
}
 catch
 (Exception err)
{
        label1.Content = "
获取服务数据失败
"
;
}
 finally

{
        busy.IsBusy = false
;
}

      由于我们从服务中获取的数据量太小,所以查看效果时,busy控件的效果只是一闪而过,但当数据量大时,这个控件提供的提示功能还是很有用的:)