Dha*_*mar 1 wcf xaml ria microsoft-metro windows-8
我想知道是否有人尝试在基于XAML的城域应用程序中使用WCF RIA服务.如果您有任何博客或样本,请分享.
事实上,我做了,这就是诀窍:)
我向我的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及其新的await和async关键字,您可以获得相同的结果,同时避免使用所有这些小回调方法对代码进行分块.
例:
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)
使用最后两种方法中的任何一种对我来说都很好:)