在Silverlight的WCF数据服务中尝试使用简单服务运算符时遇到很多问题。我已经验证了以下服务运营商正在浏览器中进行测试:
[WebGet]
public IQueryable<SecurityRole> GetSecurityRolesForUser(string userName) {
string currentUsername = HttpContext.Current.User.Identity.Name;
// if username passed in, verify current user is admin and is getting someone else's permissions
if (!string.IsNullOrEmpty(userName)) {
if (!SecurityHelper.IsUserAdministrator(currentUsername))
throw new DataServiceException(401, Properties.Resources.RequiestDeniedInsufficientPermissions);
} else // else nothing passed in, so get the current user's permissions
userName = currentUsername;
return SecurityHelper.GetUserRoles(userName).AsQueryable<SecurityRole>();
}
然而,无论我如何尝试使用我在各种在线资源中找到的不同方法,我都无法使用这些数据。我已经尝试过在使用DataServiceContext和DataServiceQuery时使用BeginExecute()方法,但是我在EndExecute方法中一直收到错误或没有返回数据。我必须做一些简单的错误...这是我的SL代码:
private void InitUserSecurityRoles() {
MyEntities context = new MyEntities(new Uri("http://localhost:9999/MyService.svc"));
context.BeginExecute<SecurityRole>(new Uri("http://localhost:9999/MyService.svc/GetSecurityRolesForUser"), OnComplete, context);
DataServiceQuery<SecurityRole> query = context.CreateQuery<SecurityRole>("GetSecurityRolesForUser");
query.BeginExecute(OnComplete, query);
}
private void OnComplete(IAsyncResult result) {
OnDemandEntities context = result.AsyncState as OnDemandEntities;
var x = context.EndExecute<SecurityRole>(result);
}
任何提示?我现在不知道如何从ODlight服务中正确使用Silverlight中的自定义服务运算符(甚至使用我的单元测试项目进行同步)。我还通过Fiddler验证了我正在传递正确的身份验证内容,甚至可以明确设置凭据。为了安全起见,我甚至从执行安全修整的服务运营商那里删除了逻辑。
答案 0 :(得分:3)
感谢@kaevans(http://blogs.msdn.com/b/kaevans):
private void InitUserSecurityRoles() {
DataServiceContext context = new DataServiceContext(new Uri("http://localhost:9999/MyService.svc"));
context.BeginExecute<SecurityRole>(new Uri("/GetSecurityRolesForUser", UriKind.Relative),
(result) => {
SmartDispatcher.BeginInvoke(
() => {
var roles = context.EndExecute<SecurityRole>(result);
UserSecurityRoles = new List<SecurityRole>();
foreach (var item in roles) {
UserSecurityRoles.Add(item);
}
});
}, null);
}
我必须创建SmartDispatcher因为这是在ViewModel中发生的。否则我可能刚刚使用了静态Dispatcher.BeginInvoke()。无法使用各种技术将角色变量直接插入到我的UserSecurityRoles(类型List)中,因此我只是手动添加它(代码不经常调用,也不是超过10个项目的集合)最大...大多数都是&lt; 5)。