2

我的WCF服务有一个OperationContract方法(getMyObject()),需要用到全局静态变量……为什么WCF操作总是报错说全局变量为null?
- 我已经使用单独的调试器单步执行了 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;
            }
        }
    }
}

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

我的对象:

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

谢谢!

4

2 回答 2

3

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

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

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

    set
    {
        Global.myObject = value;
    }   
}

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

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

于 2013-11-04T12:29:15.720 回答
1

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

于 2013-11-04T11:40:24.920 回答