C# 从服务器端调用asmx
我在一台服务器1上编写了asmx服务,在另一台服务器2上编写了asp.net/c 我想将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
字典
从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()代码>。如果这是必需的,那么应该有一个标准类型来执行此操作。没有吗?