我正在使用Silverlight和WCF RIA服务。
我的实体模型中有一个名为Activation
的类。它具有属性:Code1
和Code2
以及其他属性。
在我的silverlight客户端上,我需要向服务器发送Activation
,从服务器中挑选与其关联的对象的值,并填充Code1
和Code1
属性。例如:
Public Sub ServerMethod(ByRef myActivation as Activation)
Dim x as Integer = myActivation.Licence.NumberOfDays
Dim y as Integer = myActivation.Product.ProductSeed
myActivation.Code1 = GetCode1(x,y)
myActivation.Code2 = GetCode2(x,y)
End Sub
请注意,激活码不保留在数据库中,只需返回客户端,用户可以决定保存,如果他们愿意的话。
使用WCF RIA服务实现此目标的最佳方法是什么?起初我以为域服务中的命名更新可能会完成这项工作,但似乎没有Async回调。
任何想法都将不胜感激!
答案 0 :(得分:0)
这正是InvokeAttribute的意思,只需将其放在“ServerMethod”上即可。
关于Async,wcf ria服务中的每一次调用都是异步的,如果你想得到通知,你必须提供一个回调方法。
修改强>
我没有在你的问题中看到你需要传递“关联”属性。在这种情况下,NamedUpdate虽然在语义上不正确,但可能更容易。请记住,您的上下文必须“干净”,否则您将向服务器提交意外更改(请记住,您必须在DomainContext上调用SubmitChanges)。
如果你更喜欢使用InvokeAttribute,(这就是我要去的方式)那么,是的,正如你所指出的,将“更新的”实体返回给客户端并解决关联问题,使用序列化您自己的,即序列化您的实体并将其发送到服务器,而不是反序列化服务器端并再次序列化它,然后将其返回到客户端,在那里您最终将其反序列化。
我附加了一段代码,我使用的服务器和客户端都用于此目的。
public static class Serialization
{
public static string Serialize<T>(T obj)
{
//Create a stream to serialize the object to.
var ms = new MemoryStream();
// Serializer the User object to the stream.
var ser = new DataContractSerializer(typeof (T));
ser.WriteObject(ms, obj);
byte[] array = ms.ToArray();
ms.Close();
return Encoding.UTF8.GetString(array, 0, array.Length);
}
public static T Deserialize<T>(string obj) where T : class
{
if (obj == null)
return null;
var serializer = new DataContractSerializer(typeof (T));
var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj));
var result = serializer.ReadObject(stream) as T;
return result;
}
}
HTH