C# 为什么';WCF代理对象是否可以访问全局静态对象?
我的WCF服务有一个OperationContract方法(getMyObject()),它需要使用一个全局静态变量。。。 为什么WCF操作总是抛出一个表示全局变量为null的错误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服务主机,并且我知道全局变量不是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;
}
}