2011-06-30 48 views
9

Estoy desarrollando servicios WCF donde algunas clases tienen el atributo [MessageContract], y otras no.Mensaje o un tipo que tiene MessageContractAttribute y otros parámetros de diferentes tipos

Cuando trato de ejecutar los servicios que recibo este mensaje de error a continuación:

La operación 'ProcessOperation' no se pudo cargar porque tiene un parámetro o tipo de tipo System.ServiceModel.Channels.Message volver o un tipo que tiene MessageContractAttribute y otros parámetros de diferentes tipos. Al utilizar System.ServiceModel.Channels.Message o los tipos con MessageContractAttribute, el método no debe usar ningún otro tipo de parámetros.

¿Significa que todos los servicios deben tener [MessageContract] aunque no estén relacionados?

Respuesta

11

No, significa que tiene varios parámetros en el método y algunos de ellos no son mensajes. Intente publicar la interfaz en su servicio.

Esto explica blog post:

... problema es que los contratos de los mensajes no se pueden utilizar al mismo tiempo que otros tipos de parámetros. En este caso, el valor de retorno de la operación es una cadena. Los valores de retorno son solo otro parámetro de salida, por lo que esta operación está mezclando un mensaje de contrato de contrato con un tipo de parámetro primitivo. Esto falla porque los contratos de mensaje le dan control del diseño del mensaje SOAP, evitando que el sistema se fusione en estos parámetros adicionales.

Nota importante:

Por cierto, el mensaje de error que se obtiene al trata de mezclar mensaje contrae se parece a esto.

+2

http://blogs.msdn.com/b/drnick/archive/2006/11/27/mixing-message-contract-attributes.aspx –

0

Resuelto!

No puedo devolver String, he devuelto el objeto Saludo al cliente.

using System; 
using System.ServiceModel; 
using System.Net.Security; 

namespace com.blogspot.jeanjmichel.model 
{ 
    [MessageContract] 
    public class Greeting 
    { 
     private String userGreeting; 

     private void SetGreeting() 
     { 
      DateTime now = DateTime.Now; 

      if (now.Hour >= 7 && now.Hour <= 11) 
      { 
       this.userGreeting = "Good morning"; 
      } 
      else if (now.Hour >= 12 && now.Hour <= 17) 
      { 
       if (now.Hour == 12 || now.Hour == 13) 
       { 
        this.userGreeting = "Good afternoon, it's lunch time!"; 
       } 
       else 
       { 
        this.userGreeting = "Good afternoon"; 
       } 
      } 
      else if (now.Hour >= 18 && now.Hour <= 20) 
      { 
       this.userGreeting = "Good evening"; 
      } 
      else 
      { 
       this.userGreeting = "Good night"; 
      } 
     } 

     [MessageBodyMember(Order = 1, ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
     public String UserGreeting 
     { 
      get { return this.userGreeting; } 
     } 

     public Greeting() 
     { 
      this.SetGreeting(); 
     } 
    } 
} 

using System; 
using System.ServiceModel; 
using com.blogspot.jeanjmichel.model; 

namespace com.blogspot.jeanjmichel.services.contract 
{ 
    [ServiceContract(Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")] 
    public interface IGetGreeting 
    { 
     [OperationContract] 
     Greeting GetGreeting(Credential credential); 
    } 
} 

using System; 
using System.ServiceModel; 
using com.blogspot.jeanjmichel.services.contract; 
using com.blogspot.jeanjmichel.model; 

namespace com.blogspot.jeanjmichel.services 
{ 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
        Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")] 
    public class GetGreetingService: IGetGreeting 
    { 
     public Greeting GetGreeting(Credential credential) 
     { 
      if (String.IsNullOrEmpty(credential.Token)) 
      { 
       throw new FaultException("Inform the security phrase, and try again."); 
      } 
      else 
      { 
       if (credential.Token.Equals("[email protected]")) 
       { 
        Greeting g = new Greeting(); 
        return g; 
       } 
       else 
       { 
        throw new FaultException("Wrong password."); 
       } 
      } 
     } 
    } 
} 
2

Esto significa básicamente que una operación particular está utilizando una combinación de tipos de contrato mensaje y tipos primitivos en cualquiera de las siguientes combinaciones:

MixType1: Contract type and primitive types as operation parameters 
MixType2: Contract type as a parameter and primitive type as return type 
MixType3: Primitive type as a parameter and Contract type as return type 

cualquiera de los escenarios enumerados anteriormente generaría el error.

0

Si tiene el problema con tipos mixtos de primitiva (como cadena) y MessageContract como el otro tipo, es decir, una clase como retorno y un parámetro de cadena, una forma de resolver esto fue cambiar de MessageContract a DataContract.

La otra forma de resolver esto sería crear una clase para mantener su tipo primitivo como una propiedad, de modo que tanto su devolución como el parámetro puedan implementar MessageContract.

Cuestiones relacionadas