2012-03-07 28 views
7

Quiero tener una función en mi servicio WCF con su tipo de devolución como interfaz, pero cuando la llamo desde un cliente recibo un System.Object, no la clase que implementa la interfaz que el servicio enviadoCómo exponer una interfaz en el servicio web

Aquí hay un código de ejemplo:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

public interface IMyObject 
{ 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject : IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

En la implementación de este servicio que tengo:

public class LinqService : IService 
{ 
    public string SayHello() 
    { 
     return "Hello"; 
    } 

    public IMyObject GetMyObject() 
    { 
     return new MyObject(); 
    } 
} 

SayHello() funciona bien, pero GetMyObject() devuelve un System.Object. ¿Cómo puede cambiar este código para que GetMyObject() devuelva un objeto que implemente IMyObject?

Editar 1

cambiado el código de la siguiente manera:

using System.Runtime.Serialization; 
using System.ServiceModel; 

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

[ServiceKnownType(typeof(MyObject))] 
public interface IMyObject 
{ 
    [OperationContract] 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject:IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

Pero sin éxito!

+0

¿Puedo solicitar el propósito de devolver una interfaz desde su método WCF? – CSharpenter

+0

Lo mismo que puede devolver una interfaz desde un método: Ocultar la implementación desde el usuario de wcf. ¿Por qué mi usuario wcf debería saber sobre cualquier clase que implementé para una interfaz? El usuario solo necesita saber qué propiedades o métodos ofrece un objeto. En mi ejemplo, puedo devolver una implementación diferente de IMyObject en función de algunos parámetros. – mans

+0

En general, esa es una buena intención, pero no tiene sentido. La persona que llama no verá ninguna "implementación" de todos modos.Además, no es compatible con 'OperationContract' dentro de' DataContract'. Los dos son conceptos realmente separados. Debe consultar [Diseño de contratos de servicio] (http://msdn.microsoft.com/en-us/library/ms733070.aspx) en MSDN para obtener más información. –

Respuesta

9

Todos los tipos de argumento de contrato y devolución de WCF tienen que ser serializables; las interfaces no son This question explora el mismo problema con una respuesta que gira en torno al atributo KnownType; Si va a realizar varias implementaciones de IMyObject lo recomendaría, de lo contrario tendrá que cambiar el tipo de devolución a MyObject.

+0

Por favor, vea mi edición en la pregunta original. – mans

+1

Desde un punto de vista del diseño puro, su pregunta "¿por qué mi usuario wcf debe saber sobre cualquier clase que implementé para una interfaz?" es completamente válido, pero desafortunadamente es solo un hecho de la forma en que funciona WCF. –

+0

Pruebe agregar los atributos 'KnownType' y' ServiceKnownType' y agréguelos a 'IService' en lugar de a' IMyObject'. –

1

Notas adicionales sobre la serialización Las siguientes reglas se aplican también a los tipos soportados por el contrato de datos Serializador:

tipos genéricos son totalmente compatibles con el serializador contrato de datos.

Los tipos anulables son totalmente compatibles con el serializador de contrato de datos.

Los tipos de interfaz se tratan como Objeto o, en el caso de las interfaces de recopilación, como tipos de colección.

.....

Ir al MSDN Additional Notes on Serialization


EDIT:

supongo que estamos hablando de objetos de cliente activado. Para obtener más información al respecto, consulte la siguiente publicación Returning an interface from a WCF service Ve que solo puede enviar datos a través de serialización en WCF pero no implementación. A la inversa, su problema es usar instancias.

Cuestiones relacionadas