gpt4 book ai didi

c# - 为什么 WCF 代理对象不能访问全局静态对象?

转载 作者:行者123 更新时间:2023-11-30 20:53:42 26 4
gpt4 key购买 nike

我的 WCF 服务有一个 OperationContract 方法 (getMyObject()),它需要使用一个全局静态变量...为什么 WCF 操作总是抛出一个错误,说全局变量为空?
- 我已经使用单独的调试器单步执行了 WCF 服务主机,并且我知道全局变量不为空! - 但对客户来说,它似乎是空的!

请求客户端:

namespace my_Server.stuffPage {
protected void Page_Load(object sender, EventArgs e) {
ChannelFactory<IGlobal_ServiceContract> pipeFactory = new
ChannelFactory<IGlobal_ServiceContract>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://mylocalhost/myService"));
GlobalProxy = pipeFactory.CreateChannel();
ListMyObjects myObjects = GlobalProxy.getMyObjects();
}
}

服务主机:

namespace my_WindowsService { 
public class myServiceHost {
public void startWCFService() {
try {
Uri baseAddress = new Uri("net.pipe://www.myDomain.com/myService");
serviceHost = new ServiceHost(Program.g, baseAddress);
serviceHost.Open();
} catch (Exception ex) {
Debug.WriteLine(DateTime.Now + " my_WindowsService.myServiceHost .startWCFService() failed. " + ex.Message);
throw ex;
}
}
}
}

服务合约接口(interface):

[ServiceContract(Namespace = "http://mylocalhost/myService")]
public interface IGlobal_ServiceContract {
[OperationContract]
List<MyObject> getMyObject();
}

服务合约对象:

namespace my_WindowsService { 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[DataContract]
public class Global : IGlobal_ServiceContract {
[DataMember]
public static List<MyObject> myObject { get; set; }
public List<myObject> getMyObject() {
return Global.myObject;
}
}
}

我的对象:

namespace my_WindowsService {
public class MyObject(){
public int x = 0;
}
}

谢谢!

最佳答案

在我看来,您似乎在尝试通过服务调用传递对象静态属性?如果是这样,那就根本不可能了。 静态不会被序列化,因为序列化是基于实例的。

您可以(可能)通过将静态封装在非静态属性中来传递静态:

[DataMember]
public List<MyObject> myObjectProp
{
get
{
return Global.myObject;
}

set
{
Global.myObject = value;
}
}

话虽如此,每当您遇到这种 hack 时,重新考虑您的设计可能是个好主意 - 您的字段真的需要静态吗?也许您需要传输其他一些对象,并且只将其结果放在您的单例/静态类中?

例如,我猜您正在使用 myObject 作为一种缓存 - 您可以将缓存放在单例类中(这将使其可通过 WCF 传输),并在客户端上用你从服务端得到的东西初始化它。当然还有其他有效的选项,但我很确定在这里使用 static 不是一个好的选择...

关于c# - 为什么 WCF 代理对象不能访问全局静态对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com