使用引用类型时WCF客户端出错

时间:2011-09-23 11:38:11

标签: .net silverlight-4.0 wcf-ria-services

我正在使用WCF驱动的silverlight应用程序。 Web服务使用引用类型,如StringBuilder。但是,在将StringBuilder或DateTime对象传递给&从服务中,对象的状态会丢失。 是否无法更新通过Web服务传递的参数/返回类型的状态,如果是,那么我缺少什么?

我已经验证了我的应用程序,否则我的代码工作正常(例如,如果我使用字符串或任何其他原始类型通过WCF服务进行更新)

myObj //[myObj Is-A StringBuilder / Has-A StringBuilder, or any other 'reference' object type]

referenceObj.MethodAsync(myObj); // pass on to server-ignoring the values for now


server end  : no ref/out and Simple assignment/append of Value of/inside the object. Object state is updated.

//receive in the delegate
.. MethodCompletedEventArgs e){
myObj = e.Result;   // Expect here,the updated value

3 个答案:

答案 0 :(得分:2)

WCF不是远程处理。它仅用于来回传输信息。

<强>更新

您仍然认为WCF取代了远程处理。

引用类型不像.NET Remoting那样使用它们的引用进行传输。它们被视为值类型。从服务器接收的对象与服务器中存在的对象不同。

因此,更改对象客户端不会改变服务器端。您需要将其发回并手动更新服务器端对象。

答案 1 :(得分:1)

当通过服务边界时,数据基本上被复制。在另一端所做的更改完全丢失,并且不会返回给调用者。如果您想要更改,请:

  • 中返回这些值
  • (在某些情况下)将ref添加到参数中 - 引擎可能使用它将数据传播回调用者(请注意,在这种情况下,它将交换对象,而不是合并更改)

(两者中的第一个更易于推理,并且将更加一致地工作)

答案 2 :(得分:0)

当通过服务边界时,数据被序列化(复制)。要确保您的类可序列化,请将[Serialize]关键字添加到类中。如果您使用的是无法序列化的对象,则编译器将发出错误。

正如Marc所说,WCF不是远程处理。在COM下,所有数据都是按值传递的,但为了“帮助”开发人员,它在返回时使用底层机制返回值,然后在封面下创建对它的引用。但这并没有提供帮助,而是造成了大多数开发人员无法想象的许多问题。 WCF改变了所有这一切,现在所有内容都按值传递。

HTH