您的位置:首页 > 理论基础 > 计算机网络

C# 以 HTTP/SSL(双向) 方式请求 Java Jersey 发布的 Restful 资源与TCPSocket客户端

2011-11-22 15:49 441 查看
 由于项目需要,现在要用C#以HTTP方式请求Java Jersey发布的 Restful资源。自己写了一个工具类,开源一下。

高手请飘过。请不要做非人类的事情,转载请留名!

 

 

using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Configuration;
namespace EriloanUtilLibrary.Http
{
    /// <summary>
    /// HTTP工具类
    /// </summary>
    public class HttpTools
    {
        /// <summary>
        /// 证书路径
        /// </summary>
        public String certFilePath { get; set; }
        /// <summary>
        /// 证书口令
        /// </summary>
        public String certFilePwd { get; set; }
        /// <summary>
        /// API地址
        /// </summary>
        public String apiUrl { get; set; }
        /// <summary>
        /// API密钥
        /// </summary>
        public String apiKey { get; set; }
        /// <summary>
        /// Socket服务器地址
        /// </summary>
        public String socketServerIP { get; set; }
        /// <summary>
        /// Socket服务器端口
        /// </summary>
        public Int32 socketServerPort { get; set; }
        /// <summary>
        /// 默认的构造函数
        /// </summary>
        public HttpTools()
        {
            this.certFilePath = ConfigurationManager.AppSettings["certFilePath"];
            this.certFilePwd = ConfigurationManager.AppSettings["certFilePwd"];
            this.apiUrl = ConfigurationManager.AppSettings["apiUrl"];
            this.apiKey = ConfigurationManager.AppSettings["apiKey"];
            this.socketServerIP = ConfigurationManager.AppSettings["socketServerIP"];
            this.socketServerPort = Int32.Parse(ConfigurationManager.AppSettings["socketServerPort"]);
        }
        /// <summary>
        /// 带参数据的构造函数
        /// </summary>
        /// <param name="certFilePath"></param>
        /// <param name="certFilePwd"></param>
        /// <param name="apiUrl"></param>
        /// <param name="apiKey"></param>
        /// <param name="socketServerIP"></param>
        /// <param name="socketServerPort"></param>
        public HttpTools(String certFilePath, String certFilePwd, String apiUrl, String apiKey, String socketServerIP, Int32 socketServerPort)
        {
            this.certFilePath = certFilePath;
            this.certFilePwd = certFilePwd;
            this.apiUrl = apiUrl;
            this.apiKey = apiKey;
            this.socketServerIP = socketServerIP;
            this.socketServerPort = socketServerPort;
        }
        /// <summary>
        /// 以GET方式请求HTTP
        /// </summary>
        /// <param name="url"></param>
        /// <param name="isLoadCert"></param>
        /// <returns></returns>
        public String CreateHttpGet(String url, bool isLoadCert)
        {
            HttpWebRequest request = CreateHttpRequest(url, @"GET", isLoadCert);
            return CreateHttpResponse(request);
        }
        /// <summary>
        /// 以Post方式请求HTTP
        /// </summary>
        /// <param name="url"></param>
        /// <param name="sendMsg"></param>
        /// <param name="isLoadCert"></param>
        /// <returns></returns>
        public String CreateHttpPost(String url, String sendMsg, bool isLoadCert)
        {
            HttpWebRequest request = CreateHttpRequest(url, @"POST", isLoadCert);
            if (null != sendMsg && !"".Equals(sendMsg))
            {
                AddHttpRequestParams(request, sendMsg);
            }
            return CreateHttpResponse(request);
        }
        /// <summary>
        /// 以PUT方式请求HTTP
        /// </summary>
        /// <param name="url"></param>
        /// <param name="sendMsg"></param>
        /// <param name="isLoadCert"></param>
        /// <returns></returns>
        public String CreateHttpPut(String url, String sendMsg, bool isLoadCert)
        {
            HttpWebRequest request = CreateHttpRequest(url, @"PUT", isLoadCert);
            if (null != sendMsg && !"".Equals(sendMsg))
            {
                AddHttpRequestParams(request, sendMsg);
            }
            return CreateHttpResponse(request);
        }
        /// <summary>
        /// 以DELETE方式请求HTTP
        /// </summary>
        /// <param name="url"></param>
        /// <param name="sendMsg"></param>
        /// <param name="isLoadCert"></param>
        /// <returns></returns>
        public String CreateHttpDelete(String url, String sendMsg, bool isLoadCert)
        {
            HttpWebRequest request = CreateHttpRequest(url, @"DELETE", isLoadCert);
            if (null != sendMsg && !"".Equals(sendMsg))
            {
                AddHttpRequestParams(request, sendMsg);
            }
            return CreateHttpResponse(request);
        }
        /// <summary>
        /// 为HttpRequest添加参数
        /// </summary>
        /// <param name="request"></param>
        /// <param name="sendData"></param>
        private void AddHttpRequestParams(HttpWebRequest request, String sendData)
        {
            byte[] data = Encoding.UTF8.GetBytes(sendData);
            request.ContentLength = data.Length;
            Stream requestStream = null;
            using (requestStream = request.GetRequestStream())
            {
                requestStream.Write(data, 0, data.Length);
            }
            requestStream.Close();
        }
        /// <summary>
        /// 创建HttpResponse
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private String CreateHttpResponse(HttpWebRequest request)
        {
            String str;
            HttpWebResponse response = null;
            Stream responseStream = null;
            StreamReader responseReader = null;
            try
            {
                using (response = (HttpWebResponse)request.GetResponse())
                {
                    responseStream = response.GetResponseStream();
                    responseReader = new StreamReader(responseStream, Encoding.UTF8);
                    StringBuilder sb = new StringBuilder();
                    sb.Append(responseReader.ReadToEnd());
                    str = sb.ToString();
                }
            }
            catch (Exception e)
            {
                str = "{\"rescode\":\"0\",\"resmsg\":\"通信失败。原因:" + e.Message + "\"}";
            }
            finally
            {
                if (null != response)
                {
                    responseReader.Close();
                    responseStream.Close();
                    response.Close();
                }
            }
            return str;
        }
        /// <summary>
        /// 创建HttpWebRequest
        /// </summary>
        /// <returns></returns>
        private HttpWebRequest CreateHttpRequest(String url, String method, bool isLoadCert)
        {
            HttpWebRequest request = null;
            try
            {
                request = (HttpWebRequest)WebRequest.Create(apiUrl + url);
                if (isLoadCert)
                {
                    X509Certificate2 cert = CreateX509Certificate2();
                    request.ClientCertificates.Add(cert);
                }
                request.KeepAlive = true;
                request.ContentType = "application/json";
                request.Headers.Add("x-appKey", apiKey);
                request.Method = method;
            }
            catch (Exception)
            {
                //Console.WriteLine("创建HttpRequest失败。原因:" + e.Message);
                request = null;
            }
            return request;
        }
        /// <summary>
        ///  以TCPSocket方式请求数据
        /// </summary>
        /// <param name="sendMsg"></param>
        /// <returns></returns>
        public String CreateSocket(String sendMsg)
        {
            String rcMsg = null;
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.socketServerIP), this.socketServerPort);
            byte[] data = new byte[1024 * 1024 * 100];
            int recv = 0;
            Socket socketClient = null;
            try
            {
                socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketClient.Connect(ipep);
                socketClient.Send(Encoding.UTF8.GetBytes(sendMsg));
                while (true)
                {
                    data = new byte[1024 * 1024 * 100];
                    recv = socketClient.Receive(data, data.Length, 0);
                    if (recv <= 0)
                    {
                        break;
                    }
                    rcMsg += Encoding.UTF8.GetString(data, 0, recv).Trim();
                }
                socketClient.Shutdown(SocketShutdown.Both);
            }
            catch (SocketException e)
            {
                rcMsg = "无法创建Socket。" + e.Message;
            }
            finally
            {
                socketClient.Close();
            }
            return rcMsg;
        }
        /// <summary>
        /// 创建X509证书
        /// </summary>
        /// <returns></returns>
        private X509Certificate2 CreateX509Certificate2()
        {
            X509Certificate2 cert = null;
            try
            {
                cert = new X509Certificate2(certFilePath, certFilePwd);
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ServerCertificateValidationCallback);
            }
            catch (Exception)
            {
                //Console.WriteLine("创建X509Certificate2失败。原因:" + e.Message);
                cert = null;
            }
            return cert;
        }
        /// <summary>
        /// 证书验证回调函数
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="cer"></param>
        /// <param name="chain"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        public bool ServerCertificateValidationCallback(object obj, X509Certificate cer, X509Chain chain, System.Net.Security.SslPolicyErrors error)
        {
            return true;
        }
    }
}


app.config

 

<appSettings>
<add key="certFilePath" value="D:\192_168_201_8.pfx" />
<add key="certFilePwd" value="eriloan" />
<add key="apiUrl" value="https://192.168.201.8:8443/eriloan_com/api/v1/" />
<add key="apiKey" value="newlinetech" />
<add key="socketServerIP" value="192.168.1.198" />
<add key="socketServerPort" value="10000" />
</appSettings>


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息