using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Net; using System.Text; using System.IO; using System.Net.Security; using System.Security.Cryptography.X509Certificates; public class HttpBehaviour : MonoBehaviour { string url; string method; string content; string contentType; int totalRetryTimes = 3; Action callBack; bool getResult = false; float timeOut = 0f; CookieContainer cookie; HttpWebRequest request; bool ok = false; string message = string.Empty; public static int ConnectAllTimes = 0; static HttpBehaviour() { ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidationCallback; } public static void Create(string _url, string _method, string _content, string _contentType, int _retry = 3, Action _result = null) { var carrier = new GameObject(); GameObject.DontDestroyOnLoad(carrier); carrier.hideFlags = HideFlags.HideInHierarchy; var behaviour = carrier.AddComponent(); behaviour.Begin(_url, _method, _content, _contentType, _retry, _result); } void Begin(string _url, string _method, string _content, string _contentType, int _retry = 3, Action _result = null) { this.url = _url; this.method = _method; this.content = _content; this.contentType = _contentType; this.totalRetryTimes = _retry; this.callBack = _result; this.timeOut = Time.time + 5f; try { cookie = new CookieContainer(); request = (HttpWebRequest)WebRequest.Create(_url); request.ServicePoint.Expect100Continue = false; request.Method = _method; request.ContentType = _contentType; request.CookieContainer = cookie; request.Timeout = 2000; request.ReadWriteTimeout = 2000; request.Proxy = null; request.KeepAlive = true; //设置为true,部分请求节点大文件会有问题,在请求完成后手动Abort释放 } catch (Exception ex) { if (request != null) { request.Abort(); } ok = false; message = ex.Message; getResult = true; } if (_method == "POST") { var data = Encoding.UTF8.GetBytes(_content); request.ContentLength = data.Length; try { var stream = request.BeginGetRequestStream(GetRequestStreamCallback, null); } catch (System.Exception ex) { if (request != null) { request.Abort(); } ok = false; message = ex.Message; getResult = true; } } else { try { request.BeginGetResponse(OnHttpWebResponse, null); } catch (System.Exception ex) { if (request != null) { request.Abort(); } ok = false; message = ex.Message; getResult = true; } } } private static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { return true; } var acceptCertificate = true; if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable) { acceptCertificate = false; } else { if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch) { acceptCertificate = false; } if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors) { foreach (X509ChainStatus item in chain.ChainStatus) { if (item.Status != X509ChainStatusFlags.RevocationStatusUnknown && item.Status != X509ChainStatusFlags.OfflineRevocation) { break; } if (item.Status != X509ChainStatusFlags.NoError) { acceptCertificate = false; } } } } if (acceptCertificate == false) { acceptCertificate = true; } return acceptCertificate; } void Update() { if (Time.time > timeOut && !getResult) { if (request != null) { request.Abort(); } ok = false; message = "TimeOut"; getResult = true; } if (getResult) { try { Debug.LogFormat("Http 数据通信 {0},请求数据结果:{1},内容:{2}", this.url, ok, message); if (ok) { ConnectAllTimes = 0; } else { ConnectAllTimes++; } if (callBack != null) { callBack(ok, message); } } catch (Exception ex) { Debug.LogError(ex); } finally { callBack = null; request?.Abort(); Destroy(this.gameObject); } } } private void GetRequestStreamCallback(IAsyncResult ar) { Stream postStream; try { postStream = request.EndGetRequestStream(ar); byte[] byteArray = Encoding.UTF8.GetBytes(content); postStream.Write(byteArray, 0, byteArray.Length); postStream.Close(); request.BeginGetResponse(OnHttpWebResponse, request); } catch (Exception ex) { if (request != null) { request.Abort(); } ok = false; message = ex.Message; getResult = true; } } private void OnHttpWebResponse(IAsyncResult _result) { HttpWebResponse response = null; try { response = request.EndGetResponse(_result) as HttpWebResponse; response.Cookies = cookie.GetCookies(response.ResponseUri); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); response.Close(); request.Abort(); ok = true; message = retString; } catch (System.Exception ex) { if (response != null) { response.Close(); } if (request != null) { request.Abort(); } ok = false; message = ex.Message; getResult = true; } finally { getResult = true; } } }