Csharp/CSharp Tutorial/Network/SOAP Serialization

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Call Soap service

<source lang="csharp">using System; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.XPath; public class CallSoap {

 private const string soapNS = "http://schemas.xmlsoap.org/soap/envelope/";
 private const string yourNS = "http://yourName.ru";
 private static readonly Encoding encoding = Encoding.UTF8;
 public static void Main(string [] args) {
   MemoryStream stream = new MemoryStream( );
   XmlTextWriter writer = new XmlTextWriter(stream,encoding);
   writer.WriteStartDocument( );
   writer.WriteStartElement("soap","Envelope",soapNS);
   writer.WriteStartElement("Body",soapNS);
   writer.WriteStartElement("GetNumberInStock",yourNS);
   writer.WriteElementString("productCode","1111");
   writer.WriteEndElement( ); 
   writer.WriteEndElement( ); 
   writer.WriteEndElement( ); 
   writer.WriteEndDocument( );
   writer.Flush( );
   stream.Seek(0,SeekOrigin.Begin);
   StreamReader reader = new StreamReader(stream);
   string soap = reader.ReadToEnd( );
   HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1/myQuery.asmx");
   request.Method = "POST";
   request.ContentType = "text/xml; charset=" + encoding.HeaderName;
   request.ContentLength = soap.Length;
   request.Headers["SOAPAction"] = "http://Product.ru/GetNumberInStock";
   StreamWriter streamWriter = new StreamWriter(request.GetRequestStream( ));
   streamWriter.Write(soap);
   streamWriter.Flush( );
   WebResponse response = request.GetResponse( );
   Stream responseStream = response.GetResponseStream( );
   XPathDocument document = new XPathDocument(responseStream);
   XPathNavigator nav = document.CreateNavigator( );
   XPathNodeIterator nodes = nav.Select("//Envelope/Body/GetNumberIn/GetNumberInResult");
   Console.WriteLine(nodes.Current);
 }

}</source>

Invoke web service with Http Get

<source lang="csharp">using System; using System.IO; using System.Net; using System.Xml.XPath; public class GetNumberInStockHttpGet {

 public static void Main(string [] args) {
   WebRequest request = WebRequest.Create("http://127.0.0.1/Query.asmx/GetNumber?pCode=1111");
   request.Method = "GET";
   WebResponse response = request.GetResponse( );
   Stream stream = response.GetResponseStream( );
   XPathDocument document = new XPathDocument(stream);
   XPathNavigator nav = document.CreateNavigator( );
   XPathNodeIterator nodes = nav.Select("//int");
   Console.WriteLine(nodes.Current);
 }

}</source>

Serialization of an object list in SOAP

<source lang="csharp">using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; [Serializable] public class MyElement {

   public MyElement(string name)
   {
       this.name = name;
       this.cacheValue = 15;
   }
   public override string ToString()
   {
       return(String.Format("{0}: {1}", name, cacheValue));
   }
   string name;
   [NonSerialized]
   int cacheValue;

} [Serializable] public class MyElementList {

   public void Add(MyElement my)
   {
       row.Add(my);
   }
   
   public override string ToString()
   {
       string temp = null;
       foreach (MyElement my in row)
           temp += my.ToString() + "\n"; 
       return(temp);
   }
   
   ArrayList row = new ArrayList();    

} class MainClass {

   public static void Main()
   {
       MyElementList row = new MyElementList();
       row.Add(new MyElement("Gumby"));
       row.Add(new MyElement("Pokey"));
       
       Console.WriteLine("Initial value");
       Console.WriteLine("{0}", row);
       
       // write to SOAP (XML), read it back
       Stream streamWrite = File.Create("MyElementList.xml");
       SoapFormatter soapWrite = new SoapFormatter();
       soapWrite.Serialize(streamWrite, row);
       streamWrite.Close();
       
       Stream streamRead = File.OpenRead("MyElementList.xml");
       SoapFormatter soapRead = new SoapFormatter();
       MyElementList rowSoap = (MyElementList) soapRead.Deserialize(streamRead);
       streamRead.Close();
       
       Console.WriteLine("Values after SOAP serialization");
       Console.WriteLine("{0}", rowSoap);
       
   }

}</source>

Initial value
Gumby: 15
Pokey: 15
Values after SOAP serialization
Gumby: 0
Pokey: 0

Serialize object to SOAP message

<source lang="csharp">using System; using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Soap; [Serializable] public class MyElement {

   public MyElement(string name)
   {
       this.name = name;
       this.cacheValue = 15;
   }
   public override string ToString()
   {
       return(String.Format("{0}: {1}", name, cacheValue));
   }
   string name;
   [NonSerialized]
   int cacheValue;

} class MainClass {

   public static void Main()
   {
       MyElement ele = new MyElement("name");
       
       Console.WriteLine("Initial value");
       Console.WriteLine("{0}", ele);
       
       // write to SOAP (XML), read it back
       Stream streamWrite = File.Create("MyElement.xml");
       SoapFormatter soapWrite = new SoapFormatter();
       soapWrite.Serialize(streamWrite, ele);
       streamWrite.Close();
       
       Stream streamRead = File.OpenRead("MyElement.xml");
       SoapFormatter soapRead = new SoapFormatter();
       MyElement element = (MyElement) soapRead.Deserialize(streamRead);
       streamRead.Close();
       
       Console.WriteLine("Values after SOAP serialization");
       Console.WriteLine("{0}", element);
   }

}</source>

Initial value
name: 15
Values after SOAP serialization
name: 0

Soap Custom Serialization

<source lang="csharp">using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Soap; [Serializable] class Employee: ISerializable {

   int id;
   string name;
   string address;
   
   public Employee(int id, string name, string address)
   {
       this.id = id;
       this.name = name;
       this.address = address;
   }
   
   public override string ToString()
   {
       return(String.Format("{0} {1} {2}", id, name, address));
   }
   
   Employee(SerializationInfo info, StreamingContext content)
   {
       id = info.GetInt32("id");
       name = info.GetString("name");
       address = info.GetString("address");
   }
   
   // called to save the object data        
   public void GetObjectData(SerializationInfo info, StreamingContext content)
   {
       info.AddValue("id", id);
       info.AddValue("name", name);
       info.AddValue("address", address);
   }

} class MainClass {

   public static void Main()
   {
       Employee employee = new Employee(15, "F", "B");
       
       Stream streamWrite = File.Create("emp.dat");
       IFormatter writer = new SoapFormatter();
       writer.Serialize(streamWrite, employee);
       streamWrite.Close();
       Stream streamRead = File.OpenRead("emp.dat");
       IFormatter reader = new SoapFormatter();
       employee = (Employee) reader.Deserialize(streamRead);
       streamRead.Close();
       Console.WriteLine("Employee: {0}", employee);
   }

}</source>

Employee: 15 F B