C# http 发送接收xml数据

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Security.Cryptography;

namespace TaoBaoInterface
{
    public class Service
    {
        public static string TaobaoUrl = "http://110.75.50.103/user/WareHouseReceiveMessage.do";

        /***
        *   测试DSA公钥
        */
       static String strPublicKey = "MIIBtjCCASsGByqGSM44BAEwggEeAoGBAKRQ3ELATnIGJbRJE9+84RER2ULkU7eS"
                        + "zrvX7RF1El0zlv65yI4Qgt9LeU464F6tV42aogHvh5lIe5HoKv0hKM+Am5BgSOSz"
                        + "5f1+SD3NXOaiQfTcSZCOtZhbcZlPDx7OYraISenxHmEAUZoli0n9IscmsCprIJI0"
                        + "/o1A9cnyQWoRAhUApBkCOX0pRTaE6P5s0VjgWW43hnkCgYAOG949Z9DcaRPuyCq0"
                        + "fN7/5IVgIPsqA0vCY0ZWe+PULdfvKg+fLERt2LMYJlksD/KUb4FLgdKtBqI1ggbZ"
                        + "Jdc8lbvgIFzV1XnYkcMJIVobSIAZDVA+2F/uVhj17EiOGWw1Oa+cRP8rDFNkUh2V"
                        + "XNDqncfQr5zA1W/dQg4wu2zb2gOBhAACgYBCvUMmkn8wAliTXcFDn0/ZvO/2J9iO"
                        + "l8FxsyhQu9iiF1OCvmTkT5Rwb3z61hixxi5JO4+aqZszlm8wMkxqOS8IaDYIWQl6"
                        + "/rLV2+9YENEhmIuC3ngce3gZIsayzdxDnzxUqTww8MEV+t3SmWxgLHbTpvXhyFG6"
                        + "DjzLcWRlT6RNtA==";

 

        /***
           测试DSA私钥
        */
       static String strPrivateKey = "MIIBSgIBADCCASsGByqGSM44BAEwggEeAoGBAKRQ3ELATnIGJbRJE9+84RER2ULk"
                        + "U7eSzrvX7RF1El0zlv65yI4Qgt9LeU464F6tV42aogHvh5lIe5HoKv0hKM+Am5Bg"
                        + "SOSz5f1+SD3NXOaiQfTcSZCOtZhbcZlPDx7OYraISenxHmEAUZoli0n9IscmsCpr"
                        + "IJI0/o1A9cnyQWoRAhUApBkCOX0pRTaE6P5s0VjgWW43hnkCgYAOG949Z9DcaRPu"
                        + "yCq0fN7/5IVgIPsqA0vCY0ZWe+PULdfvKg+fLERt2LMYJlksD/KUb4FLgdKtBqI1"
                        + "ggbZJdc8lbvgIFzV1XnYkcMJIVobSIAZDVA+2F/uVhj17EiOGWw1Oa+cRP8rDFNk"
                        + "Uh2VXNDqncfQr5zA1W/dQg4wu2zb2gQWAhRGDs9OGMdl9f4Sx/fzUSszlYCm1g==";
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url">请求的url地地址</param>
        /// <param name="xml">请求的xml内容</param>
        /// <returns></returns>
        public static string SendAPI(string url,string xml)
        {
            /***
            *   测试DSA公钥
            */
           
            #region 对xml做DSA密钥签名            
            #endregion            
            string formatString = "logistics_interface={0}&data_digest={1}&type=v1.0";
            string postData = string.Format(formatString, HttpUtility.UrlEncode(xml, Encoding.GetEncoding("GBK")), HttpUtility.UrlEncode(DSAEnCryptoService(xml), Encoding.GetEncoding("GBK")));
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] data = encoding.GetBytes(postData);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "Post";
            request.ContentType = "application/x-www-form-urlencoded; charset=GBK";
            request.ContentLength = data.Length;

            //发送数据
            Stream newStream = request.GetRequestStream();
            newStream.Write(data, 0, data.Length);
            newStream.Close();

            HttpWebResponse responseSorce = (HttpWebResponse)request.GetResponse();

            Stream stream = responseSorce.GetResponseStream();
            StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("GBK"));
            string content = reader.ReadToEnd();
            content = Filert(content);
            stream.Close();
            return content;           
        }

        public static string DecodeReponse(string content)
        {

            int start = content.IndexOf("<?xml");
            int end = content.LastIndexOf("</Response>");
            int length = end - start + "</Response>".Length;
            string res =  content.Substring(start, length);
            return res;
        }

        #region Dirty work
        private static string Filert(string responseHtml)
        {
            
            // ---------------------------------
            // Wait for the closing </html> tag
            // ---------------------------------
            Regex eof = new Regex("</html>", RegexOptions.IgnoreCase);


            string finalHtml = responseHtml.ToString();
            Regex re = null;


            // The title has an id="..." which we need to get rid of
            re = new Regex("<title(http://www.cnblogs.com/shuzhengyi/admin/file://s+id/=.+?)>", RegexOptions.IgnoreCase);
            finalHtml = re.Replace(finalHtml, new MatchEvaluator(TitleMatch));

            // Replace language="javascript" with script type="text/javascript"
            re = new Regex("(?<=script\\s*)(language=\"javascript\")", RegexOptions.IgnoreCase);
            finalHtml = re.Replace(finalHtml, new MatchEvaluator(JavaScriptMatch));

            // If there are still any language="javascript" are left, delete them
            finalHtml = Regex.Replace(finalHtml, "language=\"javascript\"", string.Empty, RegexOptions.IgnoreCase);

            // Clean up images. Some images have a border property which is deprecated in XHTML
            re = new Regex("<img.*(border=\".*?\").*?>", RegexOptions.IgnoreCase);
            finalHtml = re.Replace(finalHtml, new MatchEvaluator(ImageBorderMatch));

            // Wrap the __VIEWSTATE tag in a div to pass validation
            re = new Regex("(<input.*?__VIEWSTATE.*?/>)", RegexOptions.IgnoreCase);
            finalHtml = re.Replace(finalHtml, new MatchEvaluator(ViewStateMatch));

            // If __doPostBack is registered, replace the whole function
            if (finalHtml.IndexOf("__doPostBack") > -1)
            {
                try
                {
                    int pos1 = finalHtml.IndexOf("var theform;");
                    int pos2 = finalHtml.IndexOf("theform.__EVENTTARGET", pos1);
                    string methodText = finalHtml.Substring(pos1, pos2 - pos1);
                    string formID = Regex.Match(methodText, "document.forms\\[\"(.*?)\"\\];", RegexOptions.IgnoreCase).Groups[1].Value.Replace(":", "_");

                    finalHtml = finalHtml.Replace(methodText,
                        @"var theform = document.getElementById ('" + formID + "');\r\n\t\t");
                }
                catch
                {
                }
            }

            // Remove the "name" attribute from <form> tags because they are invalid
            re = new Regex("<form\\s+(name=.*?\\s)", RegexOptions.IgnoreCase);
            finalHtml = re.Replace(finalHtml, new MatchEvaluator(FormNameMatch));
            //return finalHtml;

            // Write the formatted HTML back
            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);
            return System.Text.Encoding.Default.GetString(data);
        }

        //---------------------------------------------------------------------------
        private static string TitleMatch(Match m)
        {
            return m.ToString().Replace(m.Groups[1].Value, string.Empty);
        }

        //---------------------------------------------------------------------------
        private static string JavaScriptMatch(Match m)
        {
            return m.ToString().Replace(m.Groups[1].Value, "type=\"text/javascript\"");
        }

        //---------------------------------------------------------------------------
        private static string ImageBorderMatch(Match m)
        {
            return m.ToString().Replace(m.Groups[1].Value, string.Empty);
        }

        //---------------------------------------------------------------------------
        private static string ViewStateMatch(Match m)
        {
            return string.Concat("<div>", m.Groups[1].Value, "</div>");
        }

        //---------------------------------------------------------------------------
        private static string FormNameMatch(Match m)
        {
            return m.ToString().Replace(m.Groups[1].Value, string.Empty);
        }
        #endregion

        /// <summary>
        /// 用私钥加密数据
        /// </summary>
        /// <param name="str"></param>
        /// <returns>返回的是签名数据</returns>
        public static string DSAEnCryptoService(string str)
        {
            DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
            byte[] privateBytes = null;
            byte[] bytes = Encoding.Default.GetBytes(str); //xml数据

            privateBytes = Convert.FromBase64String(strPrivateKey);

            AsnKeyParser keyParser = new AsnKeyParser(privateBytes);

            dsac.ImportParameters(keyParser.ParseDSAPrivateKey());

            byte[] sign = dsac.SignData(bytes);

            string yy = "";
            foreach (byte bt in sign)
            {

                yy += bt.ToString() + ", ";
            }
            string dd = yy;

            string strsign = Convert.ToBase64String(sign);
            return strsign;

        }


        /// <summary>
        /// 用公钥解密数据
        /// </summary>
        /// <param name="str"></param>
        /// <returns>返回的是签名数据</returns>
        public static bool DSACryptoService(string str, string signstr)
        {
            try
            {
                byte[] bytes = Encoding.Default.GetBytes(str); //xml数据(URL解码以后的)
                byte[] signbytes = Convert.FromBase64String(signstr);  //签名后的数据
                DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider();
                byte[] publicBytes = null;
                publicBytes = Convert.FromBase64String(strPublicKey);
                AsnKeyParser keyParser1 = new AsnKeyParser(publicBytes);
                dsac2.ImportParameters(keyParser1.ParseDSAPublicKey());
                bool ver = dsac2.VerifyData(bytes, signbytes);
                if (ver)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                string strlog = str + "| " + signstr + "| " + e.ToString();
                return false;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值