Client与Service调用Execute项目时共享属性值不一致的原因及解决
这个问题的核心在于进程隔离——你得明白,你的WinForms客户端(Client)和ASMX Web服务(Service)是完全独立的两个运行进程,它们各自加载了Execute程序集的副本,彼此之间的数据完全不互通。
为什么共享属性的值会丢失?
你在Client里设置的Parameters类的共享(Shared)属性,只存在于Client进程的内存空间里。而Service进程会单独加载一套Execute程序集,拥有自己完全独立的Parameters静态实例——这个实例从来没被赋值过,所以默认是0,这就是你看到的“值丢失”现象。
你测试时在Service启动时赋值能生效,是因为那时候你是在Service进程自己的Parameters实例里赋值的,自然能读到;但Client的赋值和Service进程完全没关系,所以Service还是读自己的默认值。
解决方法
1. 直接在Web服务调用时传递参数(最推荐)
这是最可靠、最符合Web服务设计原则的方式——Web服务应该是无状态的,不要依赖外部共享状态。你可以修改代码,把需要的参数直接传给Web服务方法,再传递给Execute里的业务方法:
首先修改Execute里的UseProperties类,让它不依赖共享属性,而是接收参数:
Public Class UseProperties Public Shared Function UsePropertiesDoingSomething(firstProp As Integer, secondProp As Integer) As Integer Return firstProp + secondProp End Function End Class
然后修改ASMX服务的Web方法,接收参数并传递:
<WebMethod> Public Function ProcessProperties(firstProp As Integer, secondProp As Integer) As Integer Return UseProperties.UsePropertiesDoingSomething(firstProp, secondProp) End Function
最后在Client里调用Web服务时,把你已经设置好的参数传过去:
' Client窗体中的调用代码 Dim serviceProxy As New YourServiceReference.ServiceSoapClient() Dim result = serviceProxy.ProcessProperties(Parameters.FirstProperty, Parameters.SecondProperty)
2. 使用共享存储(适合需要持久化或跨进程共享状态的场景)
如果你的业务场景确实需要跨进程共享状态,可以使用外部共享存储:
- 数据库:把参数存在数据库里,
Client写入,Service读取 - 分布式缓存:比如Redis(跨进程/机器的可靠缓存),若用
MemoryCache需注意IIS应用池回收会导致数据丢失 - 本地文件/注册表:适合同一台机器的场景,但要注意并发读写的问题
3. 进程间通信(IPC)
如果Client和Service在同一台机器上,可以使用IPC机制(比如命名管道、WCF、Windows消息)让Client把参数传递给Service,但这种方式复杂度较高,一般不推荐,除非有特殊需求。
内容的提问来源于stack exchange,提问作者Paul Karam

