zoukankan      html  css  js  c++  java
  • c#soap调用WebService

    辅助类

     /// <summary> 
        /// 上传数据参数 
        /// </summary> 
        public class UploadEventArgs : EventArgs
        {
            int bytesSent;
            int totalBytes;
            /// <summary> 
            /// 已发送的字节数 
            /// </summary> 
            public int BytesSent
            {
                get { return bytesSent; }
                set { bytesSent = value; }
            }
            /// <summary> 
            /// 总字节数 
            /// </summary> 
            public int TotalBytes
            {
                get { return totalBytes; }
                set { totalBytes = value; }
            }
        }
    
        /// <summary> 
        /// 下载数据参数 
        /// </summary> 
        public class DownloadEventArgs : EventArgs
        {
            int bytesReceived;
            int totalBytes;
            byte[] receivedData;
            /// <summary> 
            /// 已接收的字节数 
            /// </summary> 
            public int BytesReceived
            {
                get { return bytesReceived; }
                set { bytesReceived = value; }
            }
            /// <summary> 
            /// 总字节数 
            /// </summary> 
            public int TotalBytes
            {
                get { return totalBytes; }
                set { totalBytes = value; }
            }
            /// <summary> 
            /// 当前缓冲区接收的数据 
            /// </summary> 
            public byte[] ReceivedData
            {
                get { return receivedData; }
                set { receivedData = value; }
            }
        }
    
        public class WebClient2
        {
            Encoding encoding = Encoding.UTF8;
            string respHtml = "";
            WebProxy proxy;
            static CookieContainer cc;
            WebHeaderCollection requestHeaders;
            WebHeaderCollection responseHeaders;
            int bufferSize = 15240;
            public event EventHandler<UploadEventArgs> UploadProgressChanged;
            public event EventHandler<DownloadEventArgs> DownloadProgressChanged;
            static WebClient2()
            {
                LoadCookiesFromDisk();
            }
            /// <summary> 
            /// 创建WebClient的实例 
            /// </summary> 
            public WebClient2()
            {
                requestHeaders = new WebHeaderCollection();
                responseHeaders = new WebHeaderCollection();
            }
            /// <summary> 
            /// 设置发送和接收的数据缓冲大小 
            /// </summary> 
            public int BufferSize
            {
                get { return bufferSize; }
                set { bufferSize = value; }
            }
            /// <summary> 
            /// 获取响应头集合 
            /// </summary> 
            public WebHeaderCollection ResponseHeaders
            {
                get { return responseHeaders; }
            }
            /// <summary> 
            /// 获取请求头集合 
            /// </summary> 
            public WebHeaderCollection RequestHeaders
            {
                get { return requestHeaders; }
            }
            /// <summary> 
            /// 获取或设置代理 
            /// </summary> 
            public WebProxy Proxy
            {
                get { return proxy; }
                set { proxy = value; }
            }
            /// <summary> 
            /// 获取或设置请求与响应的文本编码方式 
            /// </summary> 
            public Encoding Encoding
            {
                get { return encoding; }
                set { encoding = value; }
            }
            /// <summary> 
            /// 获取或设置响应的html代码 
            /// </summary> 
            public string RespHtml
            {
                get { return respHtml; }
                set { respHtml = value; }
            }
            /// <summary> 
            /// 获取或设置与请求关联的Cookie容器 
            /// </summary> 
            public CookieContainer CookieContainer
            {
                get { return cc; }
                set { cc = value; }
            }
            /// <summary> 
            ///  获取网页源代码 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <returns></returns> 
            public string GetHtml(string url)
            {
                HttpWebRequest request = CreateRequest(url, "GET");
                respHtml = encoding.GetString(GetData(request));
                return respHtml;
            }
    
            public CredentialCache CredentialCache
            {
                get;
                set;
            }
            /// <summary> 
            /// 下载文件 
            /// </summary> 
            /// <param name="url">文件URL地址</param> 
            /// <param name="filename">文件保存完整路径</param> 
            public void DownloadFile(string url, string filename)
            {
                FileStream fs = null;
                try
                {
                    HttpWebRequest request = CreateRequest(url, "GET");
                    byte[] data = GetData(request);
                    fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
                    fs.Write(data, 0, data.Length);
                }
                finally
                {
                    if (fs != null) fs.Close();
                }
            }
            /// <summary> 
            /// 从指定URL下载数据 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <returns></returns> 
            public byte[] GetData(string url)
            {
                HttpWebRequest request = CreateRequest(url, "GET");
                return GetData(request);
            }
            /// <summary> 
            /// 向指定URL发送文本数据 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <param name="postData">urlencode编码的文本数据</param> 
            /// <returns></returns> 
            public string Post(string url, string postData)
            {
                byte[] data = encoding.GetBytes(postData);
                return Post(url, data);
            }
            /// <summary> 
            /// 向指定URL发送字节数据 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <param name="postData">发送的字节数组</param> 
            /// <returns></returns> 
            public string Post(string url, byte[] postData, string contentType = "application/x-www-form-urlencoded")
            {
                HttpWebRequest request = CreateRequest(url, "POST");
                request.ContentType = contentType;
                request.ContentLength = postData.Length;
                request.KeepAlive = true;
                PostData(request, postData);
                respHtml = encoding.GetString(GetData(request));
                return respHtml;
            }
            /// <summary> 
            /// 向指定URL发送字节数据 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <param name="postData">发送的字节数组</param> 
            /// <returns></returns> 
            public string Post(string url, string data, WebHeaderCollection header, string contentType = "application/x-www-form-urlencoded")
            {
                byte[] postData = encoding.GetBytes(data);
                HttpWebRequest request = CreateRequest(url, "POST");
                request.ContentType = contentType;
                request.ContentLength = postData.Length;
                request.KeepAlive = true;
                foreach (string key in header.Keys)
                {
                    request.Headers.Add(key, header[key]);
                }
                PostData(request, postData);
                respHtml = encoding.GetString(GetData(request));
                return respHtml;
            }
            /// <summary> 
            /// 向指定网址发送mulitpart编码的数据 
            /// </summary> 
            /// <param name="url">网址</param> 
            /// <param name="mulitpartForm">mulitpart form data</param> 
            /// <returns></returns> 
            //public string Post(string url, MultipartForm mulitpartForm)
            //{
            //    HttpWebRequest request = CreateRequest(url, "POST");
            //    request.ContentType = mulitpartForm.ContentType;
            //    request.ContentLength = mulitpartForm.FormData.Length;
            //    request.KeepAlive = true;
            //    PostData(request, mulitpartForm.FormData);
            //    var stream = GetData(request);
            //    respHtml = encoding.GetString(stream);
            //    return respHtml;
            //}
            /// <summary> 
            /// 读取请求返回的数据 
            /// </summary> 
            /// <param name="request">请求对象</param> 
            /// <returns></returns> 
            private byte[] GetData(HttpWebRequest request)
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                responseHeaders = response.Headers;
                //SaveCookiesToDisk();
    
                DownloadEventArgs args = new DownloadEventArgs();
                if (responseHeaders[HttpResponseHeader.ContentLength] != null)
                    args.TotalBytes = Convert.ToInt32(responseHeaders[HttpResponseHeader.ContentLength]);
    
                MemoryStream ms = new MemoryStream();
                int count = 0;
                byte[] buf = new byte[bufferSize];
                while ((count = stream.Read(buf, 0, buf.Length)) > 0)
                {
                    ms.Write(buf, 0, count);
                    if (this.DownloadProgressChanged != null)
                    {
                        args.BytesReceived += count;
                        args.ReceivedData = new byte[count];
                        Array.Copy(buf, args.ReceivedData, count);
                        this.DownloadProgressChanged(this, args);
                    }
                }
                stream.Close();
                //解压 
                if (ResponseHeaders[HttpResponseHeader.ContentEncoding] != null)
                {
                    MemoryStream msTemp = new MemoryStream();
                    count = 0;
                    buf = new byte[100];
                    switch (ResponseHeaders[HttpResponseHeader.ContentEncoding].ToLower())
                    {
                        case "gzip":
                            GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress);
                            while ((count = gzip.Read(buf, 0, buf.Length)) > 0)
                            {
                                msTemp.Write(buf, 0, count);
                            }
                            return msTemp.ToArray();
                        case "deflate":
                            DeflateStream deflate = new DeflateStream(ms, CompressionMode.Decompress);
                            while ((count = deflate.Read(buf, 0, buf.Length)) > 0)
                            {
                                msTemp.Write(buf, 0, count);
                            }
                            return msTemp.ToArray();
                        default:
                            break;
                    }
                }
                return ms.ToArray();
            }
            /// <summary> 
            /// 发送请求数据 
            /// </summary> 
            /// <param name="request">请求对象</param> 
            /// <param name="postData">请求发送的字节数组</param> 
            private void PostData(HttpWebRequest request, byte[] postData)
            {
                int offset = 0;
                int sendBufferSize = bufferSize;
                int remainBytes = 0;
                Stream stream = request.GetRequestStream();
                UploadEventArgs args = new UploadEventArgs();
                args.TotalBytes = postData.Length;
                while ((remainBytes = postData.Length - offset) > 0)
                {
                    if (sendBufferSize > remainBytes) sendBufferSize = remainBytes;
                    stream.Write(postData, offset, sendBufferSize);
                    offset += sendBufferSize;
                    if (this.UploadProgressChanged != null)
                    {
                        args.BytesSent = offset;
                        this.UploadProgressChanged(this, args);
                    }
                }
                stream.Close();
            }
            /// <summary> 
            /// 创建HTTP请求 
            /// </summary> 
            /// <param name="url">URL地址</param> 
            /// <returns></returns> 
            private HttpWebRequest CreateRequest(string url, string method)
            {
                Uri uri = new Uri(url);
    
                if (uri.Scheme == "https")
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(this.CheckValidationResult);
    
                // Set a default policy level for the "http:" and "https" schemes. 
                HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate);
                HttpWebRequest.DefaultCachePolicy = policy;
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.AllowAutoRedirect = false;
                request.AllowWriteStreamBuffering = false;
                request.Method = method;
                if (CredentialCache != null)
                {
                    request.Credentials = CredentialCache;
                    //string authByte ="NTLM " + Convert.ToBase64String(new ASCIIEncoding().GetBytes
                    //    (
                    //        CredentialCache.DefaultNetworkCredentials.UserName + ":" + 
                    //        CredentialCache.DefaultNetworkCredentials.Password
                    //    ));
                    //request.Headers.Add("Authorization", authByte);
                }
                if (proxy != null) request.Proxy = proxy;
                request.CookieContainer = cc;
                foreach (string key in requestHeaders.Keys)
                {
                    request.Headers.Add(key, requestHeaders[key]);
                }
                requestHeaders.Clear();
                return request;
            }
            private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
            {
                return true;
            }
            /// <summary> 
            /// 将Cookie保存到磁盘 
            /// </summary> 
            private static void SaveCookiesToDisk()
            {
                string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\webclient.cookie";
                FileStream fs = null;
                try
                {
                    fs = new FileStream(cookieFile, FileMode.Create);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    formater.Serialize(fs, cc);
                }
                finally
                {
                    if (fs != null) fs.Close();
                }
            }
            /// <summary> 
            /// 从磁盘加载Cookie 
            /// </summary> 
            private static void LoadCookiesFromDisk()
            {
                cc = new CookieContainer();
                string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\webclient.cookie";
                if (!File.Exists(cookieFile))
                    return;
                FileStream fs = null;
                try
                {
                    fs = new FileStream(cookieFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    cc = (CookieContainer)formater.Deserialize(fs);
                }
                finally
                {
                    if (fs != null) fs.Close();
                }
            }
        }
    View Code

    用法

             WebHeaderCollection header = new WebHeaderCollection();
                    header.Add("SOAPAction", string.Format("'{0}'", SOAPAction)); 
                    var postData = string.Format(@"<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
        <SOAP-ENV:Body>
            <m:NewContactExOrder xmlns:m='http://siebel.com/asi/BYM'>
                <InXml xsi:type='xsd:string'><![CDATA[{0}]]></InXml>
                <Source xsi:type='xsd:string'>{1}</Source>
            </m:NewContactExOrder>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>", inXml, source);
    
                    WebClient2 wc = new WebClient2();
                    var response = wc.Post(url, postData, header, "text/xml; Charset=UTF-8");
  • 相关阅读:
    mybatis plus 获取新增实体的主键
    通过 Feign 进行文件上传
    mybatis plus 更新值为null的字段
    idea 配置 service 服务,多模块同时启动
    通过设置 Chrome 解决开发调用跨域问题
    xargs 命令教程
    我的Windows 10 垃圾清理秘诀(不用优化软件)
    BugReport 分析利器 ChkBugReport
    语言与地区简码大全
    linux 将内容强制输出到终端
  • 原文地址:https://www.cnblogs.com/Nomads/p/5578382.html
Copyright © 2011-2022 走看看