2013-08-23 12 views
12

Dodając WebService odwołanie do usługi ASMX na .NET 2.0 projektu npGdzie ustawić CookieContainer na odniesienie do usługi?

var objService = new NameSpace.groupservices(); 

istnieje,

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

Dodając ServiceReference do usługi ASMX na .NET 4.0 projektu przykładem,

var objService = new NameSpace.groupservicesSoapClient(); 

nie ma żadnego nieruchomość CookieContainer dla objService

Podobne pytanie zostało zadane here bez żadnego pozytywnego rozwiązania.

Czy ktoś mógłby wskazać, gdzie można znaleźć nieruchomość?

+1

@marc_s: nawet dla usługi ASMX, powinien być za pomocą "Dodaj usługi Reference". –

Odpowiedz

-1

znaleźć rozwiązanie tutaj:

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

Okazuje się, muszę odniesienie internetową zamiast odniesienia usług

+0

Nie, nie. Jak myślisz, dlaczego to robisz? –

+0

Uzgodnione, Web Referencje to tylko stara iteracja. Użyj odpowiedzi @Markus, powyżej, zamiast tego –

8

W przeciwieństwie do ASMX Web Services, które są związane z transportem HTTP, WCF pozwala na stosowanie różnych protokołów transportowych. Dlatego nie wszystkie opcje specyficzne dla protokołu (takie jak pliki cookie dla transportu HTTP) są dostępne w odwołaniach do usługi WCF.

Można jednak dodać inspektora wiadomości, który sprawdza wiadomości wysyłane między klientem a serwerem. Ten article opisuje sposób wysyłania plików cookie na serwer.

Rozszerzyłem próbkę, aby użyć kontenera CookieContainer. Ponadto poniższy kod pokazuje, jak ocenić nagłówek Set-Cookie wysłany przez serwer w celu dodania nowych plików cookie do kontenera. Zwróć uwagę, że przykład pokazuje podstawowy zarys, ale może wymagać rozszerzenia lub zatwierdzenia. Jednak w prostym scenariuszu zadziałało.

W poniższym fragmencie przedstawiono metodę testowania usługi WCF hostowanej w usługach IIS i zintegrowanej z platformą ASP.NET. To w zasadzie echa ciasteczka wysyłane do serwera w ciąg i dodaje dwa nowe:

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

Poniższy program testowy tworzy się CookieContainer dla plików cookie, dodaje cookie demo i rejestruje nowe zachowanie dla punktu końcowego serwis:

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

zachowanie służy do dodawania inspektora niestandardowy komunikat i przekazania 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) { } 
} 

komunikat w Spector dodaje pliki cookie, gdy żądanie jest wysyłane na serwer w metodzie BeforeSendRequest i pobiera pliki cookie, które powinny zostać zaktualizowane w metodzie AfterReceiveReply. Zauważ, że correlationState zwrócony przez BeforeSendRequest jest używany do pobierania URI w 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

Otwórz plik app.config i dodać AllowCookies = „true” do wiązania.

coś takiego:

<binding allowCookies="true" /> 
+0

Biorąc pod uwagę, że najwyższa, nagradzana odpowiedź tutaj jest tak skomplikowana, wydaje się mało prawdopodobne, że jest to odpowiedź, ale przynajmniej z API eTapestry, który wymaga plików cookie do działania, to wszystko, czego potrzeba . –

+0

Wow ... stara odpowiedź, ale doskonała. Prostota zwycięża nad szaloną złożonością. Pracuję z interfejsem API SOAP (InsideSales), który wymaga logowania, który ustawia plik cookie sesji dla wszystkich przyszłych połączeń. To wszystko, czego potrzebowałem. –

Powiązane problemy