当我尝试将“添加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调用。提前致谢。
答案 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;
}