从服务器端调用asmx

本文关键字:asmx 调用 服务器端 | 更新日期: 2023-09-27 18:09:09

我在一个服务器1上写了一个asmx服务,在另一个服务器2上写了一个asp.net/c#。

我想把一个dictionary<string,string>从srv1转移到srv2。我读字典是不可序列化的,应该作为List<KeyValuePair<string,string>>发送。

在srv2上,我试图读取结果,但它的类型:

KeyValuePairOfStringString[] result = response.GetTemplatesParamsPerCtidResult;

我尝试检索键,值,但不能使每个元素不平坦:

 foreach (var pair in result)
   {
// pair has just 4 generic methods: toString, GetHashCode,GetType,Equals
   }

我该怎么做?在实现中有什么需要更改的地方吗?

TIA

从服务器端调用asmx

如何使用数组MyModel[]其中MyModel看起来像这样:

public class MyModel
{
    public string Key { get; set; }
    public string Value { get; set; }
}
在公开SOAP web服务时应该避免使用

泛型。

XmlSerializer不会序列化默认实现字典的对象。

解决这个问题的一种方法是编写一个新类,包装一个字典对象并将其值复制到可序列化对象的数组中。

你可以这样写一个类:

public class DictionarySerializer : IXmlSerializable
{
    const string NS = "http://www.develop.com/xml/serialization";
    public IDictionary dictionary;
    public DictionarySerializer() 
    {
        dictionary = new Hashtable();
    }
    public DictionarySerializer(IDictionary dictionary)
    {
        this.dictionary = dictionary;
    }
    public void WriteXml(XmlWriter w)
    {
        w.WriteStartElement("dictionary", NS);
        foreach (object key in dictionary.Keys)
        {
            object value = dictionary[key];
            w.WriteStartElement("item", NS);
            w.WriteElementString("key", NS, key.ToString());
            w.WriteElementString("value", NS, value.ToString());
            w.WriteEndElement();
        }
        w.WriteEndElement();
    }
    public void ReadXml(XmlReader r)
    {
        r.Read(); // move past container
        r.ReadStartElement("dictionary");
        while (r.NodeType != XmlNodeType.EndElement)
        {            
            r.ReadStartElement("item", NS);
            string key = r.ReadElementString("key", NS);
            string value = r.ReadElementString("value", NS);
            r.ReadEndElement();
            r.MoveToContent();
            dictionary.Add(key, value);
        }
    }
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return LoadSchema();
    }
}

然后使用此返回类型创建webservice方法。

[WebMethod]
public DictionarySerializer GetHashTable()
{
    Hashtable ht = new Hashtable();
    ht.Add(1, "Aaron");
    ht.Add(2, "Monica");
    ht.Add(3, "Michelle");
    return new DictionarySerializer (h1);
}

如果你需要更多的信息,这篇论文包含了一些关于这种技术的信息。