using com.alibaba.openapi.client.policy; using com.alibaba.openapi.client.util; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization.Json; using System.IO; using com.alibaba.openapi.client.serialize; using com.alibaba.openapi.client.entity; using System.Collections; using System.Web; namespace com.alibaba.openapi.client.http { public class HttpClient { private ClientPolicy clientPolicy; public HttpClient(ClientPolicy clientPolicy) { this.clientPolicy = clientPolicy; } public T request(AlibabaRequest request, RequestPolicy requestPolicy) { StringBuilder path = createProtocolRequestPath(requestPolicy, request); Dictionary parameters = createParameterDictionary(requestPolicy, request); StringBuilder queryBuilder = new StringBuilder(); signature(path.ToString(), parameters, requestPolicy, clientPolicy); if ("GET".Equals(requestPolicy.HttpMethod)) { String queryString = createParameterStr(parameters); String uriStr = buildRequestUri(requestPolicy, request); uriStr = uriStr + "?" + queryString; Uri uri = new Uri(uriStr); HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest; httpWebRequest.Method = "GET"; httpWebRequest.KeepAlive = false; httpWebRequest.AllowAutoRedirect = true; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.UserAgent = "Ocean/NET-SDKClient"; HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream(); DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol); ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName); return (T)rw.Result; } else { String postString = createParameterStr(parameters); byte[] postData = Encoding.UTF8.GetBytes(postString); String uriStr = buildRequestUri(requestPolicy, request); Uri uri = new Uri(uriStr); HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest; httpWebRequest.Method = "POST"; httpWebRequest.KeepAlive = false; httpWebRequest.AllowAutoRedirect = true; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.UserAgent = "Ocean/NET-SDKClient"; httpWebRequest.ContentLength = postData.Length; System.IO.Stream outputStream = httpWebRequest.GetRequestStream(); outputStream.Write(postData, 0, postData.Length); outputStream.Close(); try { HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream(); DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol); ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName); return (T)rw.Result; } catch (System.Net.WebException webException) { HttpWebResponse response = webException.Response as HttpWebResponse; Stream responseStream = response.GetResponseStream(); DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol); Exception rw = deSerializer.buildException(responseStream,500, Encoding.UTF8.EncodingName); throw rw; } } } private String buildRequestUri(RequestPolicy requestPolicy, AlibabaRequest request) { String schema = "http"; int port = clientPolicy.HttpPort; if (requestPolicy.UseHttps) { schema = "https"; port = clientPolicy.HttpsPort; } StringBuilder relativeBuilder = new StringBuilder(schema); relativeBuilder.Append("://"); relativeBuilder.Append(clientPolicy.ServerHost); if (port != 80 && port != 443) { relativeBuilder.Append(":"); relativeBuilder.Append(port); } if (requestPolicy.AccessPrivateApi) { relativeBuilder.Append("/api"); } else { relativeBuilder.Append("/openapi"); } relativeBuilder.Append("/"); relativeBuilder.Append(createProtocolRequestPath(requestPolicy, request)); return relativeBuilder.ToString(); } private StringBuilder createProtocolRequestPath(RequestPolicy requestPolicy, AlibabaRequest request) { StringBuilder relativeBuilder = new StringBuilder(); relativeBuilder.Append(requestPolicy.RequestProtocol); relativeBuilder.Append("/").Append(request.ApiId.Version); relativeBuilder.Append("/").Append(request.ApiId.NamespaceValue); relativeBuilder.Append("/").Append(request.ApiId.Name); relativeBuilder.Append("/").Append(clientPolicy.AppKey); return relativeBuilder; } private String createParameterStr(Dictionary parameters) { StringBuilder paramBuilder = new StringBuilder(); foreach (KeyValuePair kvp in parameters) { String encodedValue = null; if (kvp.Value != null) { String tempValue = kvp.Value.ToString(); byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(tempValue); encodedValue = HttpUtility.UrlEncode(byteArray, 0, byteArray.Length); } paramBuilder.Append(kvp.Key).Append("=").Append(encodedValue); paramBuilder.Append("&"); } return paramBuilder.ToString(); } private Dictionary createParameterDictionary(RequestPolicy requestPolicy, AlibabaRequest request) { Serializer serializer = SerializerProvider.getInstance().getSerializer(requestPolicy.RequestProtocol); Dictionary parameters = serializer.serialize(request.RequestEntity); if (!requestPolicy.RequestProtocol.Equals(requestPolicy.ResponseProtocol)) { parameters.Add("_aop_responseFormat", requestPolicy.ResponseProtocol); } if (requestPolicy.RequestSendTimestamp) { parameters.Add("_aop_timestamp", DateUtil.currentTimeMillis()); } parameters.Add("_aop_datePattern", DateUtil.getDatePattern()); foreach (KeyValuePair kvp in request.AddtionalParams) { parameters.Add(kvp.Key, kvp.Value); } if (request.AccessToken != null) { parameters.Add("access_token", request.AccessToken); } return parameters; } private void signature(String path, Dictionary parameters, RequestPolicy requestPolicy, ClientPolicy clientPolicy) { if (!requestPolicy.UseSignture) { return; } if (clientPolicy.AppKey == null || clientPolicy.SecretKey == null) { return; } byte[] sign = SignatureUtil.hmacSha1(path, parameters, clientPolicy.SecretKey); String signStr = SignatureUtil.toHex(sign); if (signStr != null) { parameters.Add("_aop_signature", signStr); } } private WebClient createWebClient() { WebClient client = new WebClient(); client.Headers.Add("user-agent", "Ocean/SDK Client"); return client; } } }