2010-05-26 8 views
5

Ho sviluppato una piccola applicazione in formato C# che chiama un servizio Web. Tutto funziona bene ma ho bisogno di mantenere lo stato e per farlo ho bisogno di usare un CookieContainer se non sbaglio.Client servizio Web WCF che utilizza un CookieContainer

Ho creato il riferimento di servizio utilizzando il menu "Aggiungi riferimento servizio" del mio progetto e tutto ha funzionato bene. Ma non so come aggiungere un CookieManager sul client creato.

ho trovato alcuni esempi che mostravano campioni piace:

serviceClient.CookieContainer=new CookieContainer() 

ma questo non è il caso. Il mio client di servizio non ha una tale proprietà. A proposito, sto facendo causa a Visual Studio 2010 Beta.

Grazie in anticipo!

Questo è il risultato ServiceReference (che è stato creato automaticamente):

//------------------------------------------------------------------------------ 

// // Questo codice è stato generato da un utensile. // Versione runtime: 4.0.30128.1 // // Le modifiche a questo file possono causare un comportamento errato e andranno perse se // il codice viene rigenerato. // // -------------------------------------------- ----------------------------------

namespace WSClient.SecurityServiceReference {

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace="http://max/", ConfigurationName="SecurityServiceReference.SecurityService")] 
public interface SecurityService { 

    // CODEGEN: Generating message contract since element name return from namespace is not marked nillable 
    [System.ServiceModel.OperationContractAttribute(Action="http://max/SecurityService/nextValRequest", ReplyAction="http://max/SecurityService/nextValResponse")] 
    [System.ServiceModel.TransactionFlowAttribute(System.ServiceModel.TransactionFlowOption.Allowed)] 
    WSClient.SecurityServiceReference.nextValResponse nextVal(WSClient.SecurityServiceReference.nextValRequest request); 

    // CODEGEN: Generating message contract since element name return from namespace is not marked nillable 
    [System.ServiceModel.OperationContractAttribute(Action="http://max/SecurityService/reportSessionIDRequest", ReplyAction="http://max/SecurityService/reportSessionIDResponse")] 
    [System.ServiceModel.TransactionFlowAttribute(System.ServiceModel.TransactionFlowOption.Allowed)] 
    WSClient.SecurityServiceReference.reportSessionIDResponse reportSessionID(WSClient.SecurityServiceReference.reportSessionIDRequest request); 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)] 
public partial class nextValRequest { 

    [System.ServiceModel.MessageBodyMemberAttribute(Name="nextVal", Namespace="http://max/", Order=0)] 
    public WSClient.SecurityServiceReference.nextValRequestBody Body; 

    public nextValRequest() { 
    } 

    public nextValRequest(WSClient.SecurityServiceReference.nextValRequestBody Body) { 
     this.Body = Body; 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.Runtime.Serialization.DataContractAttribute()] 
public partial class nextValRequestBody { 

    public nextValRequestBody() { 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)] 
public partial class nextValResponse { 

    [System.ServiceModel.MessageBodyMemberAttribute(Name="nextValResponse", Namespace="http://max/", Order=0)] 
    public WSClient.SecurityServiceReference.nextValResponseBody Body; 

    public nextValResponse() { 
    } 

    public nextValResponse(WSClient.SecurityServiceReference.nextValResponseBody Body) { 
     this.Body = Body; 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.Runtime.Serialization.DataContractAttribute(Namespace="")] 
public partial class nextValResponseBody { 

    [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] 
    public string @return; 

    public nextValResponseBody() { 
    } 

    public nextValResponseBody(string @return) { 
     [email protected] = @return; 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)] 
public partial class reportSessionIDRequest { 

    [System.ServiceModel.MessageBodyMemberAttribute(Name="reportSessionID", Namespace="http://max/", Order=0)] 
    public WSClient.SecurityServiceReference.reportSessionIDRequestBody Body; 

    public reportSessionIDRequest() { 
    } 

    public reportSessionIDRequest(WSClient.SecurityServiceReference.reportSessionIDRequestBody Body) { 
     this.Body = Body; 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.Runtime.Serialization.DataContractAttribute()] 
public partial class reportSessionIDRequestBody { 

    public reportSessionIDRequestBody() { 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)] 
public partial class reportSessionIDResponse { 

    [System.ServiceModel.MessageBodyMemberAttribute(Name="reportSessionIDResponse", Namespace="http://max/", Order=0)] 
    public WSClient.SecurityServiceReference.reportSessionIDResponseBody Body; 

    public reportSessionIDResponse() { 
    } 

    public reportSessionIDResponse(WSClient.SecurityServiceReference.reportSessionIDResponseBody Body) { 
     this.Body = Body; 
    } 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
[System.Runtime.Serialization.DataContractAttribute(Namespace="")] 
public partial class reportSessionIDResponseBody { 

    [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] 
    public string @return; 

    public reportSessionIDResponseBody() { 
    } 

    public reportSessionIDResponseBody(string @return) { 
     [email protected] = @return; 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
public interface SecurityServiceChannel : WSClient.SecurityServiceReference.SecurityService, System.ServiceModel.IClientChannel { 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
public partial class SecurityServiceClient : System.ServiceModel.ClientBase<WSClient.SecurityServiceReference.SecurityService>, WSClient.SecurityServiceReference.SecurityService { 

    public SecurityServiceClient() { 
    } 

    public SecurityServiceClient(string endpointConfigurationName) : 
      base(endpointConfigurationName) { 
    } 

    public SecurityServiceClient(string endpointConfigurationName, string remoteAddress) : 
      base(endpointConfigurationName, remoteAddress) { 
    } 

    public SecurityServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
      base(endpointConfigurationName, remoteAddress) { 
    } 

    public SecurityServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
      base(binding, remoteAddress) { 
    } 

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
    WSClient.SecurityServiceReference.nextValResponse WSClient.SecurityServiceReference.SecurityService.nextVal(WSClient.SecurityServiceReference.nextValRequest request) { 
     return base.Channel.nextVal(request); 
    } 

    public string nextVal() { 
     WSClient.SecurityServiceReference.nextValRequest inValue = new WSClient.SecurityServiceReference.nextValRequest(); 
     inValue.Body = new WSClient.SecurityServiceReference.nextValRequestBody(); 
     WSClient.SecurityServiceReference.nextValResponse retVal = ((WSClient.SecurityServiceReference.SecurityService)(this)).nextVal(inValue); 
     return [email protected]; 
    } 

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
    WSClient.SecurityServiceReference.reportSessionIDResponse WSClient.SecurityServiceReference.SecurityService.reportSessionID(WSClient.SecurityServiceReference.reportSessionIDRequest request) { 
     return base.Channel.reportSessionID(request); 
    } 

    public string reportSessionID() { 
     WSClient.SecurityServiceReference.reportSessionIDRequest inValue = new WSClient.SecurityServiceReference.reportSessionIDRequest(); 
     inValue.Body = new WSClient.SecurityServiceReference.reportSessionIDRequestBody(); 
     WSClient.SecurityServiceReference.reportSessionIDResponse retVal = ((WSClient.SecurityServiceReference.SecurityService)(this)).reportSessionID(inValue); 
     return [email protected]; 
    } 
} 

}

+0

Affinché il mio cliente un servizio creato per avere la proprietà CookieContainer ho dovuto creare un WebReference (.NET 2.0-Look at titolo di compatibilità sul fondo del modulo di mago), ma ho bisogno di farlo con il default VS2010 modo. qualche idea? – DaTroop

risposta

-3

Questo riferimento al servizio in creati utilizzando WCF e WCF è indipendente dal mezzo effettivo di comunicazione che significa che questi servizi possono essere utilizzati sia utilizzando webservice o servizi remoti o MSMQ. E i servizi remoti e MSMQ non hanno un concetto di cookie.

È possibile creare meglio il riferimento al servizio Web utilizzando WSDL.exe e aggiungere la classe risultante nel progetto. Ho fatto la stessa cosa

+0

L'ho già fatto! Ma grazie per la spiegazione! – DaTroop

+0

-1: cattivo suggerimento. Stai suggerendo di tornare indietro nel passato per non imparare il presente. –

0

Quotato: Se un metodo di servizio Web XML utilizza lo stato sessione, un cookie viene restituito nelle intestazioni di risposta al client del servizio Web XML che identifica in modo univoco la sessione per tale client del servizio Web XML. Affinché un servizio Web XML mantenga lo stato della sessione per un client, il client deve memorizzare il cookie.

Maggiori informazioni: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.httpwebclientprotocol.cookiecontainer.aspx

+0

Stai guardando le informazioni sui vecchi servizi web ASMX. Non usarli a meno che non sia necessario. –

12

Perché ripristinare la vecchia tecnologia, quando è possibile abilitare i cookie solo sull'associazione?

http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/

+1

Una sola solitudine funzionale che ho trovato e funziona benissimo. – David

+0

Il messaggio del link in breve (funziona): binding.AllowCookies = true; using (var webServiceProxy = new ReportExecutionServiceSoapClient (binding, endpoint)) {} –

+0

Come una parola di avvertimento .. la soluzione di gestione centralizzata nel collegamento richiede una visualizzazione molto semplificata dei cookie e non soddisfa nessuno dei 3 diversi RFC dei cookie (2109, 2965, 6265), quindi è importante capire i requisiti del server a cui ti stai connettendo. Ad esempio, ho visto un server che invia più cookie separati da virgola come da 2109 ma include solo quelli che desidera aggiornare. –