Silverlight 4 toolkit

 

http://www.cnblogs.com/2018/category/262512.html

4. 创建WPF应用程序,添加服务引用

很不幸的是,我们在WPF中尝试添加服务引用时,却会遇到下面的错误

必发bf88 1

详细的错误如下,意思是说,没有找到有关的endpoint.

必发bf88 2

 

RiaServicesToolkit

总结

RIA
Service默认只能被Silverlight访问,它确实极其方便。如果希望它能被其他客户代码访问到,则可以通过安装RIA
Service Toolkit,为其添加SOAP Endpoint来实现。

模板项目目录结构

服务端:

Models:

DTO: 用于在服务端和客户端传递的对象

Shared:用于包含服务端和客户端的共享代码

Resources:

包含可本地化的资源文件【通过连接在客户端和服务端共享】

Services

Domain Service Class: 基于WCF RIA Services框架产生的服务

客户端:

和名称对应比较清晰

如果显示项目的隐藏文件,可以看到Generated_Code目录,这个IDE基于WCF RIA
Services自动生成的对象,这样客户端就不要手动的进行代理的生成了【Project
Link】。

你可能会疑惑,这难道是一个问题吗?是的,RIA
Service默认只能在Silverlight里面访问到。我们还是通过一个例子来讲解一下吧

Siliverlight 4 Tools for VS2010(Silverligh4_Tools.exe):SL4 SDK、RIA
Service等

今天这一篇是要谈谈一个问题,就是如何让RIA
Service支持WPF此类客户端来访问?

由于WCF RIA
Services目前主要是在Silverligh的场景下使用,因此主要以这个为例说明。

3. 在Silverlight应用程序中访问这个服务

作为演示,我们做了一个很简单的界面

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <sdk:DataGrid AutoGenerateColumns="True" Margin="24,53,21,25" Name="dataGrid1" />
        <TextBlock Height="33" HorizontalAlignment="Left" Margin="25,14,0,0" Name="textBlock1" Text="Employee List" VerticalAlignment="Top" Width="219" FontSize="25"  />
    </Grid>
</UserControl>

然后通过如下的代码调用数据

using System.Windows;
using System.Windows.Controls;

namespace SilverlightApplication1
{

    using WebApplication1;

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            var ctx = new SampleDomainContext();
            var op = ctx.Load<Employee>(ctx.GetEmployeesQuery());
            dataGrid1.ItemsSource = op.Entities;
        }
    }
}

从上面的代码不难看出,在Silverlight调用RIA
Service的时候,是相当容易的,这里不用指定路径,也无需有其他更多设置。

得到的页面效果如下

必发bf88 3

你可能会有一个疑问,那么到底是调用了什么服务呢?

我们通过IE 9自带的开发工具,可以监控一下得到一个特殊的WCF地址

必发bf88 4

最后一行,很明显是一个WCF的调用地址,我们很好奇的是,它到底传递了什么东西过来呢?

必发bf88 5

该服务返回的其实是一个二进制的包,具体内容如下

必发bf88 6

虽然不能完全看懂,但可以确定的是,这是二进制序列化的结果。

那好,我们回到刚才的话题,既然这是一个WCF服务,而且也确实有一个隐含的svc地址(注意,我说的是隐含,因为物理上并不存在该文件),那么是否可以通过该地址,发起普通的服务调用呢?

我们尝试将http://localhost:11547/ClientBin/WebApplication1-SampleDomainService.svc
这个地址输入到浏览器地址栏

必发bf88 7

令人欣喜的是,我们看到了熟悉的WCF WSDL的界面。

那么,这是否意味着,我们可以在除了Silverlight之外的其他应用程序中调用该服务呢?

 

添加一个新的Domain Service
  1. 新加Ado.net Entity(EDMX), Build项目

  2. 加Domain Service Class,

必发bf88 8

Build项目

  1. 此时在浏览器即可访问,如

【服务是有框架自动生成的,对应规则是:

如果服务的类是:RIA.Web.Services.NorthWindService

那么svc服务的地址就是RIA-Web-Services-NorthWindService.svc

oData的形式

http://localhost:52878/RIA-Web-Services-NorthWindService.svc/oData/

http://localhost:52878/RIA-Web-Services-NorthWindService.svc/oData/$metadata

以上返回的是架构信息

http://localhost:52878/RIA-Web-Services-NorthWindService.svc/oData/CustomerSet

返回的是数据内容

越来越多的朋友都在使用Silverlight开发应用程序,其中我们常用的还会有一个特殊的服务,就是RIA
Service,具体来说,它是一个所谓的Domain Service.
关于这个服务的基本概念,如果有不清楚,请参考下面这个网址

前面几篇文章分析了WCF Data Service的使用,在RIA系统的开发中,和WCF Data
Service类似,WCF RIA Service提供了更方便的功能。

5. 安装RIA Service Toolkit以便添加SOAP EndPoint支持

为了解决如上的问题,微软在4月份发布了一个Toolkit,可以为RIA
Service添加SOAP EndPoint支持

请先通过下面的地址下载

http://www.microsoft.com/download/en/details.aspx?id=2384

具体来说,这个工具包提供了很多增强的功能

What is available in the Toolkit?
The following functionality are available in this release of the
Toolkit:-

  1. LinqToSql DomainService
  2. Soap endpoint – This enables you to expose a soap endpoint for your
    DomainService
  3. JSON endpoint – This enables you to expose a JSON endpoint for your
    DomainService
  4. ASP.NET DomainDataSource – This control will enable you to create
    an ASP.net application that can talk to your DomainService
  5. WCF client proxy auto generation/updating for WCF Core Service –
    This enables you to get up-to-date WCF proxy and configuration each
    time you build your solution, when you add Silverlight-enable WCF
    service in your Silverlight application.
  6. Domain Service support for Windows Azure Table Storage. When
    hosting WCF RIA Services in Windows Azure, you can now easily leverage
    Windows Azure Table Storage as your data backend. (Requires Windows
    Azure SDK 1.3)
  7. T4 template based client code generation. The feature leverages the
    code generation extensibility point added to the product and provides
    a well factored and granular mechanism to customize client code
    generation logic using T4 templates.
  8. CollectionView to enable MVVM Patterns
  9. An early preview of the jQuery client for WCF RIA Services (RIA/JS)

 

安装好之后,我们会得到一些Assembly,在如下的目录

C:\Program Files (x86)\Microsoft SDKs\RIA
Services\v1.0\Toolkit\Libraries\Server

 

本例中,我们将使用其中一个Microsoft.ServiceModel.DomainServices.Hosting.dll
来提供SOAP EndPoint支持,所以我们要将其添加到Web项目的引用列表中来

必发bf88 9

 

VS2010

 

将服务发布为JSON形式

1、添加服务承载组件

C:\Program Files\Microsoft SDKs\RIA
Services\v1.0\Toolkit\Libraries\Server\Microsoft.ServiceModel.DomainServices.Hosting.dll

这个是在RIA toolkit中的一组已经实现的功能

2、配置组件

Web.config

  <domainServices>

      <endpoints>
                    <add name=”JSON” type=”

Microsoft.ServiceModel.DomainServices.Hosting.JsonEndpointFactory,
Microsoft.ServiceModel.DomainServices.Hosting,

Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />

3、使用服务

http://localhost:52878/RIA-Web-Services-NorthWindService.svc/json/GetCustomers

具体例子参考: http://dskit.codeplex.com

http://www.silverlight.net/getstarted/riaservices/

项目模板Business Application

这个模板包含了Membership的基本应用框架。

7. 在WPF中完成服务引用,并且使用它发起调用

必发bf88 10

是的,你没有看错,我们找到了这个服务。

好吧,既然能够添加引用,接下来的事情你应该会做了吧?当然,不是很难,你懂的

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid AutoGenerateColumns="True" Margin="12,62,12,12" Name="dataGrid1" />
        <TextBlock Height="33" HorizontalAlignment="Left" Margin="12,23,0,0" Name="textBlock1" Text="Employee List" FontSize="25" VerticalAlignment="Top" Width="224" />
    </Grid>
</Window>

 

 

MainWindow.xaml.cs

using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var proxy = new RIA.SampleDomainServiceSoapClient();
            dataGrid1.ItemsSource = proxy.GetEmployees().RootResults;
        }
    }
}

必发bf88 11

BTW:我觉得WPF的界面(例如这个DataGrid)看起来没有Silverlight那么好看,不是吗?
当然,这个话题还是等我们以后有机会再来谈谈吧

 

开发环境:

2. 创建一个Domain Service

namespace WebApplication1
{
    using System.Linq;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;


    // TODO: Create methods containing your application logic.
    [EnableClientAccess()]
    public class SampleDomainService : DomainService
    {
        [Query]
        public IQueryable<Employee> GetEmployees()
        {
            return new[]{
                new Employee{FirstName="ares",LastName="chen"},
                new Employee{FirstName="mike",LastName="fei"},
                new Employee{FirstName="tom",LastName="jerry"}
            }.AsQueryable();
        }
    }
}

【备注】需要注意的是,Domain
Service是没有svc文件的,这与标准的WCF服务是完全不同的。

必发bf88 12

6. 修改Web.config,添加SOAP EndPoint

熟悉WCF的朋友都知道,WCF是基于配置的,无处不在的配置使得服务很灵活并且强大。本例中,我们也只需要修改配置文件,就可以完成添加SOAP
EndPoint的工作。下面的粗体部分是我们添加的

    <system.serviceModel>
        <domainServices>
            <endpoints>
                <add name="OData" type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
              <add name="Soap" type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, 
                       Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, 
                       PublicKeyToken=31bf3856ad364e35" />
            </endpoints>
        </domainServices>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

 

 

保存配置文件,我们再去浏览器中访问该服务。你有没有发现有什么不同呢?如果有,请告诉我吧

必发bf88 13

 

1. 定义一个业务实体类

namespace WebApplication1
{
    using System.ComponentModel.DataAnnotations;
    using System.Runtime.Serialization;
    using System.ServiceModel.DomainServices.Server;


    [DataContract]
    public class Employee
    {
        [Key][DataMember]
        public int ID { get { return this.GetHashCode(); } }


        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
    }
}
admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注