2

私の WCF サービスには、グローバル静的変数を使用する必要がある OperationContract メソッド (getMyObject()) があります... WCF 操作がグローバル変数が null であるというエラーを常にスローするのはなぜですか?
- 別のデバッガーを使用して WCF サービス ホストをステップ実行しましたが、グローバル変数が null ではないことがわかっています。- しかし、クライアントには 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(); 
    }
}

サービスホスト:

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

ありがとう!

4

2 に答える 2

3

サービス呼び出しを介してオブジェクトの静的プロパティを渡そうとしているように思えますか? もしそうなら、それは単に不可能です。シリアル化はインスタンス ベースであるため、統計はシリアル化されません。

次のように非静的プロパティにカプセル化することで、(おそらく) static を渡すことができます。

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

    set
    {
        Global.myObject = value;
    }   
}

そうは言っても、この種のハッキングに遭遇したときはいつでも、おそらく設計を再考することをお勧めします - あなたのフィールドは本当に静的である必要がありますか? たぶん、他のオブジェクトを転送して、その結果をシングルトン/静的クラスに入れる必要がありますか?

たとえばmyObject、一種のキャッシュとして使用していると思います-キャッシュをシングルトンクラスに配置し(これにより、WCFを介して転送可能になります)、クライアントでサービス側から取得したもので初期化できます。staticもちろん、他にも有効なオプションがありますが、ここで使用するのは良い選択ではないと確信しています...

于 2013-11-04T12:29:15.720 に答える