在C#Web服务中使用NameValueCollection不会产生XML可序列化错误

时间:2009-03-19 19:22:00

标签: c# dictionary xml-serialization asmx

当我尝试将“添加Web引用”添加到我的ASMX代理项目时收到此错误消息:

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

我需要将名称 - 值对传递给我的Web服务,这就是我想出的:

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

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

我现在意识到我需要帮助改变这一点(我是C#的新手和.Net框架的这一部分)。如果我能使这个工作,我的Web服务将需要由ColdFusion调用(现在我使用.aspx页面来调用Web服务)。因此无论我想出什么方式来传递可变数量的NAME-VALUE对,我都需要它可以由CF调用。提前致谢。

3 个答案:

答案 0 :(得分:5)

作为替代方案,您可以定义一个简单的NameValue类并接收一个数组。

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)

如果在客户端,您有NameValueCollection,则可以轻松映射到您的类型。检查我在此question

中发布的示例

答案 1 :(得分:2)

不幸的是,所有.NET库字典结构都不可序列化。我听说过有关this code的好消息 - 也许这会有所帮助。

基本上你将使用我链接的代码做的是创建一个新类型,它具有自定义序列化方法,允许您将字典序列化为XML。如果这是您选择的路径,最好在自己的程序集中编译此类型,以便您可以与服务的客户端共享该程序集,这样可以将其用作服务方法的参数。

答案 2 :(得分:-1)

如果您将对象用作类型,ScriptService将自动/秘密地将其序列化为字典,您可以这样使用:

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

}