2009-03-19 12 views
7

estoy recibiendo este mensaje de error cuando trato de "Agregar referencia Web" para mi proyecto de proxy ASMX:Usando NameValueCollection en C# servicio web da no XML de error serializable

**"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)"** 

tengo que pasar los pares de nombre y valor de mi servicio web y esto es lo que ocurrió:

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

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

ahora me doy cuenta que necesito ayuda para cambiar esto (soy nuevo en C# y esta parte del marco .NET). Si puedo hacer que esto funcione, mi servicio web deberá ser invocado por ColdFusion (en este momento estoy usando una página .aspx para llamar al servicio web). Entonces, sea lo que sea lo que signifique que pase para pasar un número variable de pares NAME-VALUE, necesito que los llame CF. Gracias por adelantado.

Respuesta

5

Como alternativa, puede simplemente definir una clase NameValue simple y recibir una matriz.

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) 

Si en el cliente tiene una NameValueCollection puede asignar fácilmente a su tipo. Compruebe la muestra que he publicado en este question

+0

¿Alguna posibilidad de que esté dispuesto a esbozar un poco más de esa idea? –

+0

@unknown verifique mi versión actualizada. No estoy seguro de qué más quieres saber, ¿puedes ser más específico? Probablemente necesites probarlo, verificar cómo funciona y volver con dudas, a menos que haya algo más. – eglasius

+0

También puede usar la Lista , y el cliente seguirá viendo NameValue []. –

2

Desafortunadamente, todas las estructuras del diccionario de la biblioteca .NET no son serializables. He oído cosas buenas sobre this code - quizás eso ayude.

Básicamente lo que harás con el código que he vinculado es crear un nuevo tipo que tenga métodos de serialización personalizados que te permitan serializar un diccionario a XML. Si esta es la ruta que elige, sería mejor compilar este tipo en su propio ensamblaje para que pueda compartir ese ensamblaje con el cliente de su servicio de esa manera puede usarse como un parámetro para el método de servicio.

+0

No estoy pendiente de implementar esto con una NameValueCollection; ¿Puedes sugerir una técnica con tipos más simples que sean serializables? Además, olvidé agregar ColdFusion como una etiqueta. –

+0

Yo quiero un verdadero tipo de diccionario, entonces lo que publiqué es tan simple como lo que va a obtener. Si solo quieres enviar los datos, entonces la respuesta de Freddy es probablemente el camino a seguir. –

+0

Se agregó la etiqueta ColdFusion. – flipdoubt

-1

Si utiliza objeto como un tipo, el ScriptService automáticamente/secreto serializarlo a un diccionario, para su uso como esto:

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

}

Cuestiones relacionadas