调用或命名更新?

时间:2013-03-23 18:26:29

标签: c# vb.net wcf silverlight wcf-ria-services

我正在使用Silverlight和WCF RIA服务。 我的实体模型中有一个名为Activation的类。它具有属性:Code1Code2以及其他属性。

在我的silverlight客户端上,我需要向服务器发送Activation,从服务器中挑选与其关联的对象的值,并填充Code1Code1属性。例如:

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回调。

任何想法都将不胜感激!

1 个答案:

答案 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