序列化之前要修改的WCF服务引用类型属性

时间:2018-04-27 07:48:19

标签: c# wcf synchronization

让我们说我们有以下服务,有两个运营合同。

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceCallback))]
public interface IService : IDisposable
{
    [OperationContract]
    [ServiceKnownType(typeof(ServiceProperty))]
    [FaultContract(typeof(ServiceMethodFaultException))]
    [ServiceKnownType(typeof(object[]))]
    ServiceProperty GetServicePropertyAbc();

    [OperationContract]
    void ModifyServicePropertyAbc();
}

正在实施IService的服务:

public class ServiceBase : IService
{
   ServiceProperty abc;

   public ServiceProperty GetServicePropertyAbc()
    {
          //somelogic
          return abc;
    }

   public void ModifyServicePropertyAbc()
   {
    abc = new ServiceProperty();
    abc.SomeProperty = 100 * 100;
   }
}

我们有:

  • "客户1"使用ServiceBase作为代理

  • "客户2"使用ServiceBase作为代理

两个客户的服务主机相同。

以下情景:

  • 步骤1 "客户端1"正在调用GetServiceProperty()成功

  • 第2步 GetServiceProperty()返回abc;

  • 第3步 abc正在序列化为XML

  • 第4步"客户1"正在获得XML响应

第2步第3步之间是否有可能"客户2"可以使用 ModifyServicePropertyAbc()修改 ServiceProperty abc ,以便"客户端1"会修改" abc" ??

让我们假设 GetServicePropertyAbc()方法中存在逻辑,这会锁定 abc (我们的代码是100%线程安全但我们& #39;当我们退出GetServiceProperty()范围时,我很害怕。

我只是想知道是否有可能在步骤2和步骤3之间修改 ServiceProperty abc ,或者WCF保证它不会被修改?

ServiceProperty 是一种引用类型,它非常复杂(不能用值类型替换)。

1 个答案:

答案 0 :(得分:0)

最有可能的情况是,由于您签订了服务合同,因此每次拨打电话时都会创建一个新的服务实例。对于基于会话的服务,https://github.com/ui-router/sample-app-angular-hybrid/blob/master/app/angularModule.ts#L10属性默认为true,因此每次调用时都会以新实例开始。

SessionMode = SessionMode.Required