C# 为什么';WCF代理对象是否可以访问全局静态对象?

C# 为什么';WCF代理对象是否可以访问全局静态对象?,c#,wcf,iis,datacontract,servicecontract,C#,Wcf,Iis,Datacontract,Servicecontract,我的WCF服务有一个OperationContract方法(getMyObject()),它需要使用一个全局静态变量。。。 为什么WCF操作总是抛出一个表示全局变量为null的错误 -我已经用一个单独的调试器遍历了WCF服务主机,并且我知道全局变量不是null!-但是对于客户端,它看起来是空的 请求客户端: namespace my_Server.stuffPage { protected void Page_Load(object sender, EventArgs e) {

我的WCF服务有一个OperationContract方法(getMyObject()),它需要使用一个全局静态变量。。。 为什么WCF操作总是抛出一个表示全局变量为null的错误
-我已经用一个单独的调试器遍历了WCF服务主机,并且我知道全局变量不是null!-但是对于客户端,它看起来是空的

请求客户端:

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(); 
    }
}
ServiceContract接口:

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

谢谢

尝试用[DataContract]属性装饰MyObject类定义,用[DataMember]属性装饰其成员

尝试用[DataContract]属性装饰MyObject类定义,用[DataMember]属性装饰其成员

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

您可以(可能)通过将其封装在非静态属性中来传递static,如下所示:

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

    set
    {
        Global.myObject = value;
    }   
}
[DataMember]
公共列表myObjectProp
{
收到
{
返回Global.myObject;
}
设置
{
Global.myObject=值;
}   
}
话虽如此,每当你遇到这种黑客行为,重新考虑你的设计可能是个好主意——你的领域真的需要是静态的吗?也许你需要转移一些其他的对象,只把它的结果放在你的单例/静态类中


例如,我猜您正在使用
myObject
作为一种缓存-您可以将缓存放在一个单例类中(这将使其可通过WCF进行传输),并在客户端使用从服务端获得的内容对其进行初始化。当然还有其他有效的选项,但是我很确定在这里使用
静态
不是一个好的选择…

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

您可以(可能)通过将其封装在非静态属性中来传递static,如下所示:

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

    set
    {
        Global.myObject = value;
    }   
}
[DataMember]
公共列表myObjectProp
{
收到
{
返回Global.myObject;
}
设置
{
Global.myObject=值;
}   
}
话虽如此,每当你遇到这种黑客行为,重新考虑你的设计可能是个好主意——你的领域真的需要是静态的吗?也许你需要转移一些其他的对象,只把它的结果放在你的单例/静态类中


例如,我猜您正在使用
myObject
作为一种缓存-您可以将缓存放在一个单例类中(这将使其可通过WCF进行传输),并在客户端使用从服务端获得的内容对其进行初始化。当然还有其他有效的选项,但我很确定在这里使用
静态
不是一个好的选择…

在哪里创建它的实例?似乎全局类中的myObject从未在服务器端初始化过。还请注意,在代码中调用GlobalProxy.getMyObject[s](),但服务契约具有getMyObject()方法。您在哪里创建它的实例?似乎全局类中的myObject从未在服务器端初始化。还要注意,在代码中调用GlobalProxy.getMyObject[s](),但服务契约有getMyObject()方法。谢谢!的确,我正在将一个使用global.asax的Web应用程序移植到windows_服务,所以可能设计需要考虑一下(虽然我不知道静态没有被序列化——这是什么样的愚蠢),但我经常使用静态作为实现单例模式的一种简单方式——以至于任何其他单例实现都无法实现(也就是说,如果(singletonClass==null){return new singletonClass()}现在对我来说就像是一个黑客。谢谢!我确实正在将一个使用global.asax的Web应用程序移植到windows_服务,所以可能设计需要考虑一下(尽管我不知道静态没有被序列化-这是什么愚蠢的事情)但是我经常使用静态作为实现singleton模式的一种简单方法,以至于任何其他的singleton实现(例如if(singletonClass==null){return new singletonClass()}现在对我来说都像是一个黑客。
namespace my_WindowsService {
    public class MyObject(){
        public int x = 0;
    }
}
[DataMember]
public List<MyObject> myObjectProp
{
    get
    {
        return Global.myObject;
    }

    set
    {
        Global.myObject = value;
    }   
}