2009-02-18 18 views
6

मैंने एक डब्ल्यूसीएफ डुप्लेक्स सेवा और ग्राहक लिखा है। जब तक मैं क्लाइंट कार्यान्वयन में कॉल करने की कोशिश नहीं करता तब तक सबकुछ ठीक से काम करता है। डेमांड()। ऐसा प्रतीत होता है कि सेवा कॉलबैक विधि को अनाम रूप से आमंत्रित करती है। मुझे लगता है कि मुझे याद आ रही है कि सेवा को सही तरीके से कॉन्फ़िगर कैसे करें।डुप्लेक्स कॉलबैक हमेशा अज्ञात है

कोडहोस्ट बनाने के लिए प्रयुक्त कोड;

ServiceHost duplex = new ServiceHost(new ServerWCallbackImpl());   
NetTcpBinding secureBinding = new NetTcpBinding(SecurityMode.Message); 
secureBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
duplex.AddServiceEndpoint(typeof(IServerWithCallback), 
    secureBinding, 
    "net.tcp://localhost:9080/DataService"); 
Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); //<-- this correctly shows the current principal 
duplex.Open(); 
if (duplex.State == CommunicationState.Opened) 
    ((ServerWCallbackImpl)duplex.SingletonInstance).Send("Hello World!"); 

कोड क्लाइंट बनाने के लिए उपयोग किया जाता है;

CallbackImpl callbackInstance = new CallbackImpl(); 
NetTcpBinding secureBinding = new NetTcpBinding(SecurityMode.Message); 
secureBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
DuplexChannelFactory<IServerWithCallback> cf = new DuplexChannelFactory<IServerWithCallback>(
    callbackInstance, 
    secureBinding, 
    new EndpointAddress(requestingEndpointAddress));   
cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 
cf.Credentials.Windows.ClientCredential = (NetworkCredential)CredentialCache.DefaultCredentials; 
IServerWithCallback srv = cf.CreateChannel(new InstanceContext(callbackInstance)); 
srv.InitiateConversation(); 

क्लाइंट कार्यान्वयन:

public void MethodOnClient(string message) 
{ 
    Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); // <-- anonymous 
    PrincipalPermission p = new PrincipalPermission(@"DOMAIN\User", null); 
    p.Demand(); // <-- fails 
} 

मैं इतना कैसे कॉन्फ़िगर कर सकते हैं कि ServiceHost सही ढंग से विंडोज पहचान के साथ कॉलबैक का आह्वान?

उत्तर

0

प्रतिरूपण के बजाय टोकनइम्पर्सेशनलेवल को प्रतिनिधिमंडल में सेट करना क्या है? इस तरह:

cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 

this MSDN article देखें।

+0

कब्र खोदने वाला? :) प्रश्न 18 फरवरी को पूछा गया था और पूछ रहा था कि उपयोगकर्ता निष्क्रियता के लिए हटा दिया गया था, मुझे लगता है कि बहुत समय पहले। – abatishchev

संबंधित मुद्दे