2013-08-23 6 views
12

जब उदाहरण के लिए एक .NET 2.0 परियोजना पर एक ASMX सेवा करने के लिए WebService संदर्भ जोड़ने,मैं कुकी कॉन्टेनर को सेवा संदर्भ पर कहां सेट करूं?

var objService = new NameSpace.groupservices(); 

वहां मौजूद,

objService.CookieContainer = new System.Net.CookieContainer(); 

जब लिए एक .NET 4.0 परियोजना पर एक ASMX सेवा करने के लिए ServiceReference जोड़ने उदाहरण के लिए,

var objService = new NameSpace.groupservicesSoapClient(); 

वहाँ objService

के लिए किसी भी CookieContainer संपत्ति नहीं है

कोई समान प्रश्न नहीं मिला here कोई सकारात्मक समाधान नहीं मिला।

क्या कोई व्यक्ति संपत्ति को कहां ढूंढ सकता है?

+1

@marc_s: यहां तक ​​कि एक ASMX सेवा के लिए, वह का उपयोग करना चाहिए "सेवा संदर्भ जोड़ें"। –

उत्तर

-1

यहाँ में मिला समाधान:

http://msdn.microsoft.com/en-us/library/bb628649.aspx

यह पता चला कि मैं एक सेवा संदर्भ

+0

उह, नहीं, आप नहीं करते। आपको ऐसा क्यों लगता है? –

+0

सहमत हैं, वेब संदर्भ केवल पुराने पुनरावृत्ति हैं। ऊपर दिए गए @ मार्कस के उत्तर का प्रयोग करें, इसके बजाय –

8

HTTP परिवहन, WCF से बंधी हुई ASMX वेब सेवाओं के विपरीत के बजाय वेब संदर्भ की आवश्यकता विभिन्न परिवहन प्रोटोकॉल का उपयोग करने की अनुमति देता है। इसलिए, सभी प्रोटोकॉल-विशिष्ट विकल्प (जैसे HTTP परिवहन के लिए कुकीज़) डब्ल्यूसीएफ सेवा संदर्भ में उपलब्ध नहीं हैं।

हालांकि, आप एक संदेश निरीक्षक जोड़ सकते हैं जो क्लाइंट और सर्वर के बीच भेजे गए संदेशों का निरीक्षण करता है। यह article सर्वर पर कुकीज़ भेजने का तरीका बताता है।

मैंने एक कुकी कंटनर का उपयोग करने के लिए नमूना बढ़ाया है। साथ ही, निम्न कोड कंटेनर में नई कुकीज़ जोड़ने के लिए सर्वर द्वारा भेजे गए Set-Cookie हेडर का मूल्यांकन करने का तरीका दिखाता है। कृपया ध्यान दें कि नमूना एक मूल रूपरेखा दिखाता है, लेकिन विस्तार या कुछ और सत्यापन की आवश्यकता हो सकती है। हालांकि, एक साधारण परिदृश्य में यह काम किया।

निम्न स्निपेट आईआईएस पर होस्ट की गई डब्ल्यूसीएफ सेवा की एक टेस्ट विधि दिखाता है और एएसपी.नेट फ्रेमवर्क में एकीकृत होता है। यह मूल रूप से एक स्ट्रिंग में सर्वर के लिए भेजा कुकीज़ गूँज और दो नए लोगों को जोड़ता है:

public string GetData(int value) 
{ 
    var reply = string.Join(", ", 
        from x in HttpContext.Current.Request.Cookies.AllKeys 
        select x + "=" + HttpContext.Current.Request.Cookies[x].Value); 
    HttpContext.Current.Response.Cookies.Add(new HttpCookie("Test", "Test123")); 
    HttpContext.Current.Response.Cookies.Add(new HttpCookie("Test2", "Test1234")); 
    return reply; 
} 

निम्नलिखित परीक्षण कार्यक्रम कुकीज़ के लिए एक CookieContainer बनाता है, एक डेमो कुकी रख देता है और के अंतिम बिंदु के लिए एक नया व्यवहार पंजीकृत करता है सेवा:

public class CookieBehavior : IEndpointBehavior 
{ 
    private CookieContainer cookieCont; 

    public CookieBehavior(CookieContainer cookieCont) 
    { 
     this.cookieCont = cookieCont; 
    } 

    public void AddBindingParameters(ServiceEndpoint serviceEndpoint, 
     System.ServiceModel.Channels 
     .BindingParameterCollection bindingParameters) { } 

    public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, 
     System.ServiceModel.Dispatcher.ClientRuntime behavior) 
    { 
     behavior.MessageInspectors.Add(new CookieMessageInspector(cookieCont)); 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, 
     System.ServiceModel.Dispatcher 
     .EndpointDispatcher endpointDispatcher) { } 

    public void Validate(ServiceEndpoint serviceEndpoint) { } 
} 

संदेश में:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var cookieCont = new CookieContainer(); 
     using(var svc = new TestServiceReference.TestServiceClient()) 
     { 
      cookieCont.Add(svc.Endpoint.Address.Uri, new Cookie("TestClientCookie", "Cookie Value 123")); 
      var behave = new CookieBehavior(cookieCont); 
      svc.Endpoint.EndpointBehaviors.Add(behave); 
      var data = svc.GetData(123); 
      Console.WriteLine(data); 
      Console.WriteLine("---"); 
      foreach (Cookie x in cookieCont.GetCookies(svc.Endpoint.Address.Uri)) 
       Console.WriteLine(x.Name + "=" + x.Value); 
     } 
     Console.ReadLine(); 
    } 
} 

व्यवहार CookieContainer से अधिक एक कस्टम संदेश निरीक्षक और सौंपने जोड़ने के उद्देश्य से कार्य करता है BeforeSendRequest विधि में सर्वर पर अनुरोध भेजा जाता है और AfterReceiveReply विधि में अद्यतन की जाने वाली कुकीज़ को पुनर्प्राप्त करने पर दोनों प्रोजेक्ट कुकीज़ जोड़ते हैं। ध्यान दें कि correlationStateBeforeSendRequest द्वारा दिया AfterReceiveReply में उरी पुनः प्राप्त करने के लिए किया जाता है:

public class CookieMessageInspector : IClientMessageInspector 
{ 
    private CookieContainer cookieCont; 

    public CookieMessageInspector(CookieContainer cookieCont) 
    { 
     this.cookieCont = cookieCont; 
    } 

    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, 
     object correlationState) 
    { 
     object obj; 
     if (reply.Properties.TryGetValue(HttpResponseMessageProperty.Name, out obj)) 
     { 
      HttpResponseMessageProperty httpResponseMsg = obj as HttpResponseMessageProperty; 
      if (!string.IsNullOrEmpty(httpResponseMsg.Headers["Set-Cookie"])) 
      { 
       cookieCont.SetCookies((Uri)correlationState, httpResponseMsg.Headers["Set-Cookie"]); 
      } 
     } 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, 
     System.ServiceModel.IClientChannel channel) 
    { 
     object obj; 
     if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out obj)) 
     { 
      HttpRequestMessageProperty httpRequestMsg = obj as HttpRequestMessageProperty; 
      SetRequestCookies(channel, httpRequestMsg); 
     } 
     else 
     { 
      var httpRequestMsg = new HttpRequestMessageProperty(); 
      SetRequestCookies(channel, httpRequestMsg); 
      request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMsg); 
     } 

     return channel.RemoteAddress.Uri; 
    } 

    private void SetRequestCookies(System.ServiceModel.IClientChannel channel, HttpRequestMessageProperty httpRequestMessage) 
    { 
     httpRequestMessage.Headers["Cookie"] = cookieCont.GetCookieHeader(channel.RemoteAddress.Uri); 
    } 
} 
8

अपने app.config फ़ाइल खोलें और AllowCookies = "true" बंधन को जोड़ें।

कुछ इस तरह:

<binding allowCookies="true" /> 
+0

यह देखते हुए कि शीर्ष, उदार-जीतने वाला उत्तर यहां इतना जटिल है, ऐसा लगता है कि यह उत्तर है, लेकिन कम से कम ईटैपेस्ट्री के एपीआई के साथ, जिसके लिए कुकीज़ को संचालित करने की आवश्यकता होती है, यह सब कुछ लेता है । –

+0

वाह ... पुराना जवाब लेकिन सही। सरलता पागल जटिलता पर जीतता है। मैं एक एसओएपी एपीआई (अंदरूनी सूत्र) के साथ काम कर रहा हूं जिसके लिए एक लॉगिन की आवश्यकता है जो सभी भविष्य की कॉल के लिए सत्र कुकी सेट करता है। यह सब मुझे चाहिए। –

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