Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从服务器端调用asmx_C#_.net_Asp.net_Web Services - Fatal编程技术网

C# 从服务器端调用asmx

C# 从服务器端调用asmx,c#,.net,asp.net,web-services,C#,.net,Asp.net,Web Services,我在一台服务器1上编写了asmx服务,在另一台服务器2上编写了asp.net/c 我想将字典从srv1传输到srv2。 我阅读的词典不可序列化,应作为列表发送 在srv2上,我尝试读取结果,但其类型为: KeyValuePairOfStringString[] result = response.GetTemplatesParamsPerCtidResult; 我尝试检索键、值,但无法取消对每个元素的对齐: foreach (var pair in result) { // pair

我在一台服务器1上编写了asmx服务,在另一台服务器2上编写了asp.net/c

我想将
字典
从srv1传输到srv2。 我阅读的词典不可序列化,应作为
列表发送

在srv2上,我尝试读取结果,但其类型为:

KeyValuePairOfStringString[] result = response.GetTemplatesParamsPerCtidResult;
我尝试检索键、值,但无法取消对每个元素的对齐:

 foreach (var pair in result)
   {
// pair has just 4 generic methods: toString, GetHashCode,GetType,Equals
   }
我该怎么做?在我的实现中有什么需要更改的吗


TIA

使用数组
MyModel[]
怎么样,其中
MyModel
如下所示:

public class MyModel
{
    public string Key { get; set; }
    public string Value { get; set; }
}

在公开SOAP web服务时应避免使用泛型。

使用数组
MyModel[]
如何,其中
MyModel
如下所示:

public class MyModel
{
    public string Key { get; set; }
    public string Value { get; set; }
}

在公开SOAP web服务时应避免使用泛型。

XmlSerializer不会序列化默认情况下实现IDictionary的对象

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

因此,您可以编写这样的类:

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);
}

如果需要更多信息,请包含有关此技术的一些信息。

XmlSerializer不会序列化默认情况下实现IDictionary的对象

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

因此,您可以编写这样的类:

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);
}

如果您需要更多信息,该列表将包含有关此技术的一些信息。

如果您知道返回类型不可序列化,为什么不将您的合同更改为可供客户使用的内容?列表可序列化,但反序列化时我遇到问题。为什么您说该词典不可序列化?根据这一点,它是不可XML序列化的。是否正在设置DataContractAttribute.IsReference属性?如果您知道返回类型是不可序列化的,为什么不将您的合同更改为客户端可以使用的内容呢?列表是可序列化的,但我在反序列化它时遇到问题。为什么您说字典是不可序列化的?根据这一点,它是不可XML序列化的。是否正在设置DataContractAttribute.IsReference属性?但是我如何将response.getTemplatesParcTidResult反序列化到MyModel?@Elad Benda,你不应该反序列化任何东西。您只需将web引用指向web服务的WSDL,它就会生成强类型的客户端:
MyModel[]result=client.response.GetTemplatesParamsPerCtid()。如果这是必需的,那么应该有一个标准类型来执行此操作。没有吗?但是我如何对响应进行反序列化。GetTemplatesParamsPerCtidResult到MyModel?@Elad Benda,你不应该反序列化任何东西。您只需将web引用指向web服务的WSDL,它就会生成强类型的客户端:
MyModel[]result=client.response.GetTemplatesParamsPerCtid()。如果这是必需的,那么应该有一个标准类型来执行此操作。没有吗?