RIA Service 的 SOAP EndPoint

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

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

得到的页面效果如下

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

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

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

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

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

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

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

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

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

 

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

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

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

 

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

 

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>
 
 

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

 

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

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

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

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

 

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

 

总结

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

 

时间: 2024-11-05 14:43:31

RIA Service 的 SOAP EndPoint的相关文章

Silverlight DataGrid使用WCF RIA Service实现Load-on-demand的数据加载

在Windows或者ASP.NET Web应用程序中,我们经常可以看到在Grid控件上通过Load-on-demand的方式来提高系统性能,提升用户体验. 所谓Load-on-demand就是在最初表格数据加载时只加载当前表格中用户可以看到的行数,当用户向下滚动或拖拽纵向滚动条时,再将需要显示的数据通过某种方式动态加载进来. 那么对于Silverlight,我们可以使用DataGrid通过WCF RIA Service来实现这个功能. 1.      WCF RIA Service 我们将会使用

Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)

转自 http://www.cnblogs.com/024hi/archive/2011/06/23/2088295.html WCF Service(WebService) Web Services是经实践考验证明的跨防火墙的通信方式,它很稳定且被广泛认可.总的来说你需要为分散的CRUD操作指定相应的接口并在Silverlight中忠实的调用他们 使用的原因:需要进行类似直接通过服务进行数据库交互操作的项目(弱化业务逻辑部分). 避免使用的原因:必须始终自己监视数据的变化并调用相应的服务方法进

使用Fiddler解析WCF RIA Service传输的数据

原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html     使用Fiddler 2 解析WCF RIA Service传输的数据,您需要安装一个PlugIn.下载解压后,放在Inspectors文件中.重新启动Fiddler,你就会看到WCF Binary的选项.       下面的场景是,点一个Button根据ID查询数据,UI如下图:            Server端Code,ItemContext是Do

silverlight 和wcf ria service 常见错误解决方法

1.向数据库教程添加数据时页面提示缺少对象,调试状态提示出错,无法更新entityset"*****",因为它有一个definingquery,而<modificationfunctionmapping>元素中没有支持当前操作的<insertfunction>元素" 解决办法:因为所操作的表没有添加主键,添加主键后刷新edm就可以了. 2.页面提示"iis已经设置了访问权限...",页面提示"note fond"

C# Web Service非Soap头(Session)身份验证方法

最近在做一个程序的Web Service,需要验证帐号才能使用Web Service提供的方法,首先想到把帐号信息附加在Soap头中传过去的方式,但在公司其他同事在使用非.net程序调用的时候发现有诸多不便.又Google了一镇子,发现一个使用Session的方式,说起来还是找"Web Service分段上传大附件"的时候看到的一个示例,难怪以前找Web Service验证的时候老找不到想要的结果.代码比较简单,主要代码如下: /// <summary> /// 授权验证,

求:wsdl标签binding和service中soap:binding,soap:operation,soap:address相关资料

问题描述 在学习过程中,发现wsdl:binding内建与soap协议绑定,定义soap消息的格式.引用soap:binding,soap:operation,soap:body.wsdl:service下wsdl:port中,引用soap:address.请教:1.有没有关于wsdl:binding与soap协议绑定的相关资料,最好是完整的,网上搜索的都是一段一段的:2.有没有soap:binding,soap:operation,soap:body,soap:address完整说明:3.ws

Silverlight + RIA Service的SUID的实例

1.准备工作 新建一个Silverlight Business Application, 首先修改web.config,他自动生成的配置比较省略,我 手动加入membership,role,profile的配置,我是ASP.NET MVC的项目中拷贝过来,直接用他的配置也可以, 不过手动配置一下连接字符串LocalSqlServer,不然不能运行. <membership> <providers> <clear /> <add name="AspNetS

一起谈.NET技术,Silverlight + RIA Service的SUID的实例

1.准备工作 新建一个Silverlight Business Application,首先修改web.config,他自动生成的配置比较省略,我手动加入membership,role,profile的配置,我是ASP.NET MVC的项目中拷贝过来,直接用他的配置也可以,不过手动配置一下连接字符串LocalSqlServer,不然不能运行. <membership><providers><clear /><add name="AspNetSqlMemb

通过压缩SOAP改善XML Web service性能

web|xml|性能|压缩 压缩文本是一个可以减少文本内容尺寸达80%的过程.这意味着存储压缩的文本将会比存储没有压缩的文本少80%的空间.也意味着在网络上传输内容需要更少的时间,对于使用文本通信的客户端服务器应用程序来说,将会表现出更高的效率,例如XML Web services. 本文的主要目的就是寻找在客户端和服务器之间使交换的数据尺寸最小化的方法.一些有经验的开发者会使用高级的技术来优化通过网络特别是互联网传送的数据,这样的做法在许多分布式系统中都存在瓶颈.解决这个问题的一个方法是获取更