2010-08-10 5 views
0

J'ai une liste de paires (CarType (Enum), code (string)). Malheureusement, dans cette collection, les codes ne sont pas uniques.Passage de la collection via asmx

Van,C1 
Van,C2 
Pickup,C1 

Comment passer cette collection via le service web asmx.

Maintenant, j'ai KeyValuePair [] comme Parametr dans WEBMETHOD

[webmethod] 
public void DestroyCars(KeyValuePair<string, CarType>[] cars) 
{ 
//implementation. 
} 

Mais quand je mets à jour mon WebReference (pas ServiceReference) et mettre instance de KeyValuePair [] dans

service.DestroyCars(someinstance of KeyValuePair<string, CarType>[]) 

Je me exception, parce que je dois y KeyPairValuOfStringCarType.

Pourquoi est-ce et comment le réparer?

Pour être plus clair:

Je veux passer multidimension collection par webservice.

Je crée

[WebMethod] DestroyCars public void (KeyValuePair [] voitures) {// mise en œuvre. }

Je mets à jour la référence de mon application.

Lorsque je souhaite appeler cette méthode Web à partir de mon application avec une nouvelle instance de KeyValuePair [], j'obtiens une erreur que ce paramètre n'est pas assignable au type de paramètre de ma méthode web. Intellisense me dit que le type de ce paramètre est KeyPairValuOfStringCarType avec n'est pas un vrai.

Je vérifie le type de ce type dans net.reflector et je vois que c'est une chaîne.

Je sais que cela n'a aucun sens. C'est ainsi que je demande de l'aide:/

+0

Pourriez-vous partager un message d'exception avec nous? –

+0

Désolé, pas d'exception. Je veux dire erreur. – user278618

+2

Pourriez-vous partager les informations pertinentes avec nous * indépendamment de * s'il s'agit d'une exception, et une erreur, ou quelque chose d'autre? - En outre, que signifie "parce que je dois y KeyPairValuOfStringAndCarType"? – Timwi

Répondre

4

La raison pour laquelle vous rencontrez cette erreur:

"parameter type "System.Collections.Generic.KeyValuePair[]" is not assignable to parameter type mywebservicenamespace.KeyPairValuOfStringCarType

Est-ce parce que quand asp.net crée le proxy service Web (la référence de service Web) pour vous, il "duplique" tous les types personnalisés que votre service Web expose, dans ce cas KeyValuePair<string, CarType> est converti en KeyValuePairOfStringCarType dans le proxy, de sorte qu'il existe un moyen pour vous de les transmettre dans le service Web.

Ce que vous devez faire pour appeler votre webservice est (ce qui a fonctionné pour moi, dans Visual Studio 2008, ciblant un service Web asmx):

// Create a new CarKeyValuePair in your web service project 
public struct CarKeyValuePair 
{ 
    public string Key { get; set; } 
    public CarType CarType { get; set; } 
} 

// Change your web method to use this instead of KeyValuePair 
[WebMethod] 
public void DestroyCars(CarKeyValuePair[] cars) 
{ 
    // Implementation here 
} 

Vous pouvez ensuite mettre à jour votre référence de service Web et écrire quelque chose semblable au suivant dans le code qui appelle votre service Web:

service.DestroyCars(new CarKeyValuePair[] { new CarKeyValuePair() { CarType = CarType.Pickup, Key = "C1" } }); 

// or 

var cars = new List<CarKeyValuePair>(); 
var car = new CarKeyValuePair(); 
car.CarType = CarType.Pickup; 
car.Key = "C1"; 
cars.Add(car); 
service.DestroyCars(cars.ToArray()); 
+0

Parfait, merci Rob – user278618

+1

@phenevo, pas un problème =) Comme je le soupçonne, vous savez déjà, étant donné votre mention de * webreference (pas servicereference) *, la vie devient un * lot * plus facile Si vous passez à une référence de service et à un assembly de type partagé car les types sont partagés plus facilement, c'est mon expérience avec les services basés sur WCF de toute façon, je ne sais pas quelle différence cela fait pour asmx ones =) – Rob

Questions connexes