You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:19:08