2009-09-30 5 views
1

J'ai un service web .Net avec méthode web qui prend un objet Interface comme paramètre, chaque fois que j'essaie d'accéder à la méthode, je reçois une exception: Impossible de sérialiser le produit IProduct car il s'agit d'une interface.Comment passer un objet Interface à un WebMethod?

Des suggestions pour résoudre le problème?

[WebMethod] 
Public double CalculateTotal(IProduct product, int Quantity) 
{ 
    return product.Price * Quantity; 
} 
+0

Envie de poster du code? –

+1

Ce qui n'a pas été spécifié ici est de savoir s'il est toujours approprié d'exposer des interfaces dans le cadre d'une signature de méthode web? Cela ne semblerait pas, basé sur mon expérience personnelle. – Lisa

Répondre

1

salut Prashant s'il vous plaît essayer de faire comme ça ..

Au lieu de ce

[WebMethod] 
    Public double CalculateTotal(IProduct product, int Quantity) 
    { 
    return product.Price * Quantity; 
    } 

Juste Ajouter une classe abstraite becoz vous avez besoin d'un type à sérialiser ..

[Serializable] 
    public abstract class ProductAbstract : IProduct 
    { 
    // define all methods/attributes of interface IProduct here as abstract methods/attributes 
    } 


    [WebMethod] 
    Public double CalculateTotal(ProductAbstract product, int Quantity) 
    { 
     return product.Price * Quantity; 
    } 
5

Essayez d'ajouter un attribut XmlInclude à votre méthode:

[WebMethod] 
[XmlInclude(typeof(Product))] 
Public double CalculateTotal(IProduct product, int Quantity) 
{ 
    return product.Price * Quantity; 
} 

Modifier

Juste vous Incase se confondre avec mon utilisation de la classe "produit". Remplacez cette classe par n'importe quelle classe de votre assembly qui implémente IProduct, par ex.

[Serializable] 
public class Product : IProduct 
{ 
    public Product(string name, double price) 
    { 
     this.Name = name; 
     this.Price = price; 
    } 

    public string Name { get; private set; } 
    public double Price { get; private set; } 
} 

public interface IProduct 
{ 
    string Name { get; } 
    double Price { get; } 
} 

.... 

[Web Method] 
[XmlInclude(typeof(Product))] 
Public double CalculateTotal(IProduct product, int quantity) 
{ 
    return product.Price * quantity; 
} 

Fondamentalement, lorsque vous passez une interface dans un webservice il ne peut pas trouver un schéma pour elle, donc si vous utilisez XmlInclude attribute et passer dans la classe concrète, il sera en mesure de reconnaître le type.

+0

le type de retour est double –

+0

N'a pas travaillé pour moi :( –

+0

Assurez-vous que le produit est marqué avec [Serializable] – James

Questions connexes