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

时间:2013-11-04 11:26:07

标签: c# wcf iis datacontract servicecontract

我的WCF服务有一个OperationContract方法(getMyObject()),它需要使用全局静态变量... 为什么WCF操作总是抛出错误,说全局变量为空?
- 我已经通过单独的调试器逐步完成了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(); 
    }
}

servicehost:

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;
            }
        }
    }
}

ServiceContract界面:

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

ServiceContract对象:

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; 
        }            
    }
}

MyObject:

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

    set
    {
        Global.myObject = value;
    }   
}

话虽如此,每当你遇到这种黑客攻击时,重新考虑你的设计可能是一个好主意 - 你的领域真的需要是静态的吗?也许你需要转移一些其他对象,只将它的结果放在你的单例/静态类中?

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

答案 1 :(得分:1)

尝试使用[DataContract]属性及其成员使用[DataMember]属性

来装饰MyObject类定义