2009-03-19 13 views
7

sto ottenendo questo messaggio di errore quando si tenta di "Aggiungi riferimento Web" per il mio ASMX progetto di delega:Utilizzando NameValueCollection in C# webservice dà non XML errore serializzabile

**"To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.String) at all levels of their inheritance hierarchy. System.Collections.Specialized.NameValueCollection does not implement Add(System.String)"** 

ho bisogno di passare coppie nome-valore per il mio servizio web e qui è quello che mi si avvicinò con:

public class FileService : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public string UploadFile(byte[] incomingArray 
     , string FileName 
     , long FileLengthInBytes 
     , NameValueCollection nvcMetaData) 

ora mi rendo conto ho bisogno di aiuto cambiare questo (io sono nuovo di C# e questa parte del framework .Net). Se riesco a farlo funzionare, il mio servizio web dovrà essere invocato da ColdFusion (in questo momento sto usando una pagina .aspx per chiamare il servizio web). Quindi qualunque sia il motivo per cui passo a passare un numero variabile di coppie NAME-VALUE, ne ho bisogno, callabile da CF. Grazie in anticipo.

risposta

5

In alternativa, è possibile definire una semplice classe NameValue e ricevere un array.

public class NameValue 
{ 
    public string Name{get;set;} 
    public string Value{get;set;} 
} 

[WebMethod] 
public string UploadFile(byte[] incomingArray 
    , string FileName 
    , long FileLengthInBytes 
    , NameValue[] nvcMetaData) 

Se sul lato client si dispone di un NameValueCollection è possibile mappare facilmente al tipo. Controllare il campione che ho postato in questo question

+0

Qualche possibilità che tu sia disposto a delineare un po 'di più di questa idea? –

+0

@unknown controlla la mia versione aggiornata. Non so cos'altro volessi sapere, puoi essere più specifico? Probabilmente dovrai fare un tentativo, verificare come funziona e tornare con dubbi - a meno che non ci sia qualcos'altro? – eglasius

+0

È inoltre possibile utilizzare l'elenco e il client continua a vedere NameValue []. –

2

Sfortunatamente tutte le strutture del dizionario della libreria .NET non sono serializzabili. Ho sentito cose positive su this code - forse questo aiuterà.

In pratica, ciò che si farà con il codice che ho collegato è la creazione di un nuovo tipo con metodi di serializzazione personalizzati che consentano di serializzare un dizionario in XML. Se questa è la route scelta, è consigliabile compilare questo tipo nel proprio assembly in modo che sia possibile condividere tale assembly con il client del servizio in modo che possa essere utilizzato come parametro per il metodo di servizio.

+0

Non sono impiccato a implementarlo con un NameValueCollection; puoi suggerire una tecnica con tipi più semplici che siano serializzabili? Inoltre, ho dimenticato di aggiungere ColdFusion come tag. –

+0

Io voglio un vero tipo di dizionario, quindi quello che ho postato è tanto semplice quanto lo sarà. Se vuoi solo inviare i dati, la risposta di Freddy è probabilmente la strada da percorrere. –

+0

Aggiunto il tag ColdFusion. – flipdoubt

-1

Se si utilizza oggetto come un tipo, la ScriptService verrà automaticamente/segretamente serializzare in un dizionario, per l'uso in questo modo:

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public object MyServiceMethod(int recordid, object data) 
{ 
    Dictionary<String, Object> noway = (Dictionary<String, Object>)data; 
    // ... 
    return noway; 

}

Problemi correlati