有关如何在XAML metro应用程序中使用WCF RIA服务的任何示例?

Dha*_*mar 1 wcf xaml ria microsoft-metro windows-8

我想知道是否有人尝试在基于XAML的城域应用程序中使用WCF RIA服务.如果您有任何博客或样本,请分享.

can*_*rso 7

事实上,我做了,这就是诀窍:)

我向我的WCF服务添加了一个" 服务引用 ",公开了一个ADO.NET实体框架模型.问题是在XAML/C#Metro应用程序中,执行以下代码失败:

SampleEntities ctx = ((App)Application.Current).Context;
var query = from p in ctx.Products
              where p.Name == name
              select p;

foreach (Product p in query) /** this line fails **/
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这是您在运行时获得的异常:

"Silverlight不允许您直接枚举数据服务查询.这是因为枚举会自动向数据服务发送同步请求.因为Silverlight只支持异步操作,所以必须调用BeginExecute和EndExecute方法来获取查询结果支持枚举."} [System.NotSupportedException]:{"Silverlight不允许您直接枚举数据服务查询.这是因为枚举自动向数据服务发送同步请求.因为Silverlight只支持异步操作,所以必须调用BeginExecute和EndExecute方法来获取支持枚举的查询结果."

啊,这真是太好了!

如异常中所述,您需要将服务器调用设置为异步,就像在Silverlight中一样.

以下是如何在C#Metro应用程序中使用旧学校方式使用WCF RIA服务的示例:

(...)
var query = from p in ctx.Products
            where p.Name == Name
            select p;

((DataServiceQuery<Product>)query).BeginExecute(OnLoadItemsCompleted, query);
(...)

private void OnLoadItemsCompleted(IAsyncResult result)
{
    var query = result.AsyncState as DataServiceQuery<Product>;
    IEnumerable<Product> response = query.EndExecute(result);

    foreach (Product o in response)
    {
         // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用.NET 4.5及其新的awaitasync关键字,您可以获得相同的结果,同时避免使用所有这些小回调方法对代码进行分块.

例:

async void GetProducts()
{
    SampleEntities ctx = ((App)Application.Current).Context;
    var query = from p in ctx.Products
                  where p.Name == name
                  select p;
    DataServiceQuery<Product> dqs = (DataServiceQuery<Product>)(query);
    TaskFactory<IEnumerable<Product>> tf = new TaskFactory<IEnumerable<Product>>();
    myListView.ItemsSource = await tf.FromAsync(dqs.BeginExecute(null, null), 
                               iar => dqs.EndExecute(iar));
}
Run Code Online (Sandbox Code Playgroud)

使用最后两种方法中的任何一种对我来说都很好:)