2010-05-26 26 views
5

He desarrollado una pequeña aplicación de formulario C# que llama a un servicio web. Todo funciona bien pero necesito mantener el estado y para hacerlo necesito usar un CookieContainer si no me equivoco.WCF Web Service Client utilizando un CookieContainer

Creé la referencia de servicio utilizando el menú "Agregar referencia de servicio" de mi proyecto y todo funcionó bien. Pero no sé cómo agregar un CookieManager en el cliente creado.

he encontrado algunos ejemplos que mostraban muestras gusta:

serviceClient.CookieContainer=new CookieContainer() 

pero este no es el caso. Mi cliente de servicio no tiene esa propiedad. Por cierto, estoy demandando a Visual Studio 2010 Beta.

¡Gracias de antemano!

Este es el ServiceReference resultado (que se creó automáticamente):

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

// // Este código se ha generado por una herramienta. // Versión en tiempo de ejecución: 4.0.30128.1 // // Los cambios en este archivo pueden causar un comportamiento incorrecto y se perderán si // el código se regenera. // // -------------------------------------------- ----------------------------------

espacio de nombres 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

Para que mi cliente un servicio creado para tener la propiedad CookieContainer tuve que crear un WebReference (.NET 2.0-mirada a título de compatibilidad en la parte inferior del formulario de asistente), pero tengo que hacerlo con el valor por defecto VS2010 camino. ¿algunas ideas? – DaTroop

Respuesta

-3

Esta referencia de servicio en creado usando WCF y WCF es independiente del medio real de la comunicación que significa que estos servicios se pueden utilizar ya sea usando servicio web o de interacción remota o MSMQ. Y remoting y MSMQ no tienen un concepto de cookies.

Mejor crea tu referencia de servicio web usando WSDL.exe y agrega la clase resultante en tu proyecto. Yo hice lo mismo.

+0

¡Ya lo hice! Pero gracias por la explicación! – DaTroop

+0

-1: Mala sugerencia. Estás sugiriendo que regrese al pasado para no aprender el presente. –

0

Citado: Si un método de servicio web XML usa estado de sesión, se pasa una cookie en los encabezados de respuesta al cliente del servicio web XML que identifica de forma exclusiva la sesión para ese cliente de servicio web XML. Para que un servicio web XML mantenga el estado de la sesión para un cliente, el cliente debe almacenar la cookie.

Más información: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.httpwebclientprotocol.cookiecontainer.aspx

+0

Está buscando información sobre los antiguos servicios web ASMX. No los uses a menos que sea necesario. –

12

¿Por qué volver a la tecnología anterior, cuando solo puede habilitar las cookies en el enlace?

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

+1

Una y única separación funcional que he encontrado y funciona muy bien. – David

+0

Mensaje de enlace en breve (funciona): binding.AllowCookies = true; using (var webServiceProxy = new ReportExecutionServiceSoapClient (binding, endpoint)) {} –

+0

Como una palabra de advertencia ... la solución de administración centralizada en el enlace toma una vista muy simplificada de las cookies y no cumple con ninguna de las 3 diferentes RFC de cookies (2109, 2965, 6265) por lo que es importante comprender los requisitos del servidor al que se está conectando. Por ejemplo, he visto un servidor que envía varias cookies separadas por comas de acuerdo con 2109, pero solo incluye las que quiere que actualice. –