J'ai beaucoup de problèmes pour essayer de consommer un simple opérateur de service dans un service de données WCF à partir de Silverlight. J'ai vérifié que l'opérateur de service suivant fonctionne en le testant dans le navigateur :
[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>();
}
Cependant, j'ai beau essayer d'utiliser différentes méthodes que j'ai trouvées dans diverses ressources en ligne, je n'ai pas réussi à consommer les données. J'ai essayé d'utiliser la méthode BeginExecute() sur le DataServiceContext et le DataServiceQuery, mais je continue à obtenir des erreurs ou aucune donnée retournée dans la méthode EndExecute. Je dois faire quelque chose de simple et de mal... Voici mon code 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);
}
Des conseils ? Je ne sais pas comment consommer correctement un opérateur de service personnalisé depuis Silverlight (ou même synchroniser en utilisant mon projet de test unitaire) à partir d'un service OData. J'ai également vérifié via Fiddler que je transmettais les informations d'authentification correctes, allant même jusqu'à définir explicitement les informations d'identification. Par mesure de sécurité, j'ai même supprimé la logique de l'opérateur de service qui effectue le découpage de sécurité.