7

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

**"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 调用。提前致谢。

4

3 回答 3

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 你可以很容易地映射到你的类型。检查我在这个问题中发布的示例

于 2009-03-19T19:53:29.493 回答
2

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

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

于 2009-03-19T19:26:06.877 回答
-1

如果您使用 object 作为类型,ScriptService 将自动/秘密地将其序列化为字典,供您使用,如下所示:

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

}

于 2011-11-30T21:57:46.380 回答