RIA Service 的 SOAP EndPoint

简介: 原文 www.cyqdata.com/cnblogs/article-detail-39983-english 越来越多的朋友都在使用Silverlight开发应用程序,其中我们常用的还会有一个特殊的服务,就是RIA Service,具体来说,它是一个所谓的Domain Service.

原文 www.cyqdata.com/cnblogs/article-detail-39983-english

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

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

 

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

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

 

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; }
    }
}

 

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服务是完全不同的。

image

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的时候,是相当容易的,这里不用指定路径,也无需有其他更多设置。

得到的页面效果如下

image

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

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

image

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

image

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

image

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

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

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

image

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

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

 

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

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

image

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

image

 

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项目的引用列表中来

image

 

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>
 
 

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

image

 

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

image

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

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

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;
        }
    }
}

 

image

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

 

总结

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

 

目录
相关文章
|
9月前
|
人工智能 自然语言处理 安全
已解决:Poe AI国内能用吗?国内用户如何使用Poe AI?亲测有效的方法来了!
人工智能正在重塑我们的世界,而Poe AI作为AI聊天机器人平台的佼者,更是引领着这场变革。它集成了众多顶尖AI模型,如OpenAI的GPT系列、Anthropic的Claude系列以及Google的PaLM等,为用户提供了一个探索AI无限可能的开放平台
497 12
|
10月前
|
人工智能 算法 安全
探索量子计算:从基础原理到未来应用
探索量子计算:从基础原理到未来应用
|
10月前
|
安全 网络安全 网络虚拟化
OCSP
OCSP
399 5
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI系统】AI的领域、场景与行业应用
本文概述了AI的历史、现状及发展趋势,涵盖AI系统的初步设计原则,并深入探讨了AI在计算机视觉、自然语言处理和音频处理三个领域的具体应用。同时,文中还介绍了AI在金融、医疗、教育、互联网及自动驾驶等行业中的广泛应用,强调了AI基础设施的重要性及其对企业竞争力的影响。通过阅读本文,读者不仅可以获得系统的AI知识,还能激发对AI系统研究的兴趣,掌握相关的设计原则与方法。
450 1
|
11月前
|
搜索推荐 算法 数据挖掘
随机排序算法
【10月更文挑战第19天】随机排序虽然在很多场景中并不直接用于排序数据,但它在数据处理和应用中却有着独特的价值和意义。它为我们提供了一种灵活的手段,来处理和探索数据的随机性和不确定性。
|
12月前
|
并行计算 算法 量子技术
量子计算进展:中国“九章三号”的里程碑意义
【9月更文挑战第26天】近年来,量子计算作为前沿科技的代表,正以前所未有的速度推进信息技术革命。中国科学技术大学团队成功构建了包含255个光子的量子计算原型机“九章三号”,标志着中国在量子计算领域取得重大进展,也为全球量子科技树立了新的里程碑。“九章三号”在光子数量、光子探测技术和处理速度等方面实现了重大突破,处理速度比上一代提升了100万倍。这一成果不仅巩固了中国在量子计算领域的国际领先地位,还为量子计算的实用化迈出了重要一步,进一步拓展了人类对量子世界的认知边界,提升了国家竞争力。这一成功标志着中国量子计算进入了一个崭新时代。
|
存储 编解码 容器
什么是 MKV 视频格式及其工作原理
对于希望创建、共享和享受多媒体内容的视频爱好者来说,MKV 视频格式是一种可靠且多功能的选择。 其兼容性、功能和质量使其成为休闲用户和行业专业人士的宝贵选择。
751 0
|
自然语言处理 测试技术
测试驱动开发(TDD)与行为驱动开发(BDD)的比较与选择
在软件开发中,测试驱动开发(TDD)与行为驱动开发(BDD)是两种常见的开发方法。虽然它们都强调测试在开发过程中的重要性,但是两者之间存在一些差异。本文将对TDD和BDD进行比较,分析它们各自的优点和缺点,以及在实际开发中如何选择最适合的方法。
|
弹性计算
阿里云服务器免费试用1个月到期不用请释放否则会欠费
阿里云服务器免费试用1个月到期了怎么办?不要了就释放掉,想要继续使用可以将按量转为包年包月并续费
3646 0
阿里云服务器免费试用1个月到期不用请释放否则会欠费
|
存储 Android开发
方法:一键把一堆手机号码一次性快速导入手机通讯录
手机是人们日常沟通常用的工具,所以自然就要用到手机里面的通讯录联系。因此我们常要把别人的号码存入到手机通讯录里面,如果只是存五个十个那就动动手指就可以了。但是如果你想存把一个电脑excel表格里面的几百个、几千个、几万个等数量级别的联系人一键导入手机通讯录,显然手动一个个来存入是不现实的。我这里演示,通过借助网上常见的便捷工具软件,金芝号码提取导入助手,代替你手动工作来快速完成这个工作,如何一键把一堆手机号码一次性快速导入手机通讯录,省事省时省力。下面做个操作过程的图文讲解。
4596 0
方法:一键把一堆手机号码一次性快速导入手机通讯录