让我们说我们有以下服务,有两个运营合同。
[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
第2步与第3步之间是否有可能"客户2"可以使用 ModifyServicePropertyAbc()修改 ServiceProperty abc ,以便"客户端1"会修改" abc" ??
让我们假设 GetServicePropertyAbc()方法中存在逻辑,这会锁定 abc (我们的代码是100%线程安全但我们& #39;当我们退出GetServiceProperty()范围时,我很害怕。
我只是想知道是否有可能在步骤2和步骤3之间修改 ServiceProperty abc ,或者WCF保证它不会被修改?
ServiceProperty 是一种引用类型,它非常复杂(不能用值类型替换)。
答案 0 :(得分:0)
最有可能的情况是,由于您签订了服务合同,因此每次拨打电话时都会创建一个新的服务实例。对于基于会话的服务,https://github.com/ui-router/sample-app-angular-hybrid/blob/master/app/angularModule.ts#L10属性默认为true,因此每次调用时都会以新实例开始。
SessionMode = SessionMode.Required