0

我将 Silverlight 与 WCF RIA 服务一起使用。我的实体模型中有一个名为Activation. 它具有属性:Code1以及Code2其他属性。

在我的 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 服务实现这一目标的最佳方法是什么?起初我认为域服务中的命名更新可能会完成这项工作,但似乎没有异步回调。

任何想法将不胜感激!

4

1 回答 1

0

这正是InvokeAttribute的用途,只需将其放在“ServerMethod”上即可。
关于异步,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;
    }
}

高温高压

于 2013-03-25T11:58:48.663 回答