我的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;
}
}
谢谢!
答案 0 :(得分:3)
在我看来,你试图通过服务调用传递对象静态属性?如果是这样,那根本不可能。 静态不会被序列化,因为序列化是基于实例的。
您可以(可能)通过将其封装在非静态属性中来传递静态,如下所示:
[DataMember]
public List<MyObject> myObjectProp
{
get
{
return Global.myObject;
}
set
{
Global.myObject = value;
}
}
话虽如此,每当你遇到这种黑客攻击时,重新考虑你的设计可能是一个好主意 - 你的领域真的需要是静态的吗?也许你需要转移一些其他对象,只将它的结果放在你的单例/静态类中?
例如,我猜你正在使用myObject
作为一种缓存 - 你可以将缓存放在一个单独的类中(这可以通过WCF进行转移),并在客户端初始化它你从服务方面得到了什么。当然还有其他有效选项,但我很确定在这里使用static
不是一个好选择......
答案 1 :(得分:1)
尝试使用[DataContract]属性及其成员使用[DataMember]属性
来装饰MyObject类定义