namespace Nwc.XmlRpc { using System; using System.Collections; using System.IO; using System.Xml; using System.Net; using System.Text; using System.Reflection; using System.Net.Security; using System.Security.Cryptography.X509Certificates; internal class AcceptAllCertificatePolicy : ICertificatePolicy { public AcceptAllCertificatePolicy() { } public bool CheckValidationResult(ServicePoint sPoint, System.Security.Cryptography.X509Certificates.X509Certificate cert, WebRequest wRequest, int certProb) { // Always accept return true; } } /// Class supporting the request side of an XML-RPC transaction. public class XmlRpcRequest { private String _methodName = null; private Encoding _encoding = new ASCIIEncoding(); private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); /// ArrayList containing the parameters. protected IList _params = null; /// Instantiate an XmlRpcRequest public XmlRpcRequest() { _params = new ArrayList(); } /// Instantiate an XmlRpcRequest for a specified method and parameters. /// String designating the object.method on the server the request /// should be directed to. /// ArrayList of XML-RPC type parameters to invoke the request with. public XmlRpcRequest(String methodName, IList parameters) { MethodName = methodName; _params = parameters; } /// ArrayList conntaining the parameters for the request. public virtual IList Params { get { return _params; } } /// String conntaining the method name, both object and method, that the request will be sent to. public virtual String MethodName { get { return _methodName; } set { _methodName = value; } } /// String object name portion of the method name. public String MethodNameObject { get { int index = MethodName.IndexOf("."); if (index == -1) return MethodName; return MethodName.Substring(0, index); } } /// String method name portion of the object.method name. public String MethodNameMethod { get { int index = MethodName.IndexOf("."); if (index == -1) return MethodName; return MethodName.Substring(index + 1, MethodName.Length - index - 1); } } /// Invoke this request on the server. /// String The url of the XML-RPC server. /// Object The value returned from the method invocation on the server. /// If an exception generated on the server side. public Object Invoke(String url) { XmlRpcResponse res = Send(url, 10000); if (res.IsFault) throw new XmlRpcException(res.FaultCode, res.FaultString); return res.Value; } /// Send the request to the server. /// String The url of the XML-RPC server. /// Milliseconds before the connection times out. /// XmlRpcResponse The response generated. public XmlRpcResponse Send(String url, int timeout) { // Override SSL authentication mechanisms ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); if (request == null) throw new XmlRpcException(XmlRpcErrorCodes.TRANSPORT_ERROR, XmlRpcErrorCodes.TRANSPORT_ERROR_MSG + ": Could not create request with " + url); request.Method = "POST"; request.ContentType = "text/xml"; request.AllowWriteStreamBuffering = true; request.Timeout = timeout; Stream stream = request.GetRequestStream(); XmlTextWriter xml = new XmlTextWriter(stream, _encoding); _serializer.Serialize(xml, this); xml.Flush(); xml.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader input = new StreamReader(response.GetResponseStream()); XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input); input.Close(); response.Close(); return resp; } /// Produce String representation of the object. /// String representation of the object. override public String ToString() { return _serializer.Serialize(this); } } }