1. 程式人生 > >基於.NET Core 框架搭建WebApi專案

基於.NET Core 框架搭建WebApi專案

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace Common
{
    /// <summary>
    /// HttpClient的幫助類
    /// 2015年11月12日14:43:45
    ///
</summary>
public class HttpClientHelper { /*Edit Desc: 提取預設的Http Heads UserAgen Author:Xuja Time:2016-5-3 16:46:29*/ private static readonly string userAgen = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"; ///
<summary>
/// 根據Url地址Get請求返回資料 /// 2015年11月12日14:50:02 /// </summary> /// <param name="url">請求的地址</param> /// <param name="ch_httpcode">http狀態碼</param> /// <returns>字串</returns> public static string GetResponse(string url, out
string httpStatusCode) { httpStatusCode = string.Empty; HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); //httpClient = new HttpClient(); //using (HttpClient httpClient = new HttpClient()) //{ httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.GetAsync(url).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); //此處會丟擲異常:不支援超時設定,對返回結果沒有影響 System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string result = reader.ReadToEnd(); return result; } //} return null; //} } catch { return null; } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// 根據Url地址Get請求返回資料 /// xuja /// 2015年11月12日14:50:02 /// </summary> /// <param name="url">請求的地址</param> /// <returns>字串</returns> public static string GetResponse(string url) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); //httpClient = new HttpClient(); //using (HttpClient httpClient = new HttpClient()) //{ httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.GetAsync(url).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string result = reader.ReadToEnd(); return result; } //} return null; //} } catch { return null; } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// 根據Url地址Get請求返回實體 /// xuja /// 2015年11月12日14:50:02 /// </summary> /// <param name="url">請求的地址</param> /// <returns>實體</returns> public static T GetResponse<T>(string url) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ //httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); //HttpResponseMessage response = httpClient.GetAsync(url).Result; Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url); taskResponse.Wait(); T result = default(T); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string s = reader.ReadToEnd(); result = JsonConvertTool.DeserializeObject<T>(s); } //} return result; //} } catch (Exception e) { var resp = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(e.ToString()), ReasonPhrase = "error" }; //throw new HttpResponseException(resp); return default(T); } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// 處理Get的Url /// des:huyf /// </summary> /// <param name="dic"></param> /// <returns></returns> public static string WithParameters(Dictionary<string, string> dic) { string result = "?"; foreach (var item in dic) { result += item.Key + "=" + item.Value + "&"; } result = result.Remove(result.Length - 1); return result; } /// <summary> /// Post請求返回字元 /// </summary> /// <param name="url">請求地址</param> /// <param name="postData">請求資料</param> /// <returns>字元</returns> public static string PostResponse(string url, string postData) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); HttpContent httpContent = new StringContent(postData); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string result = reader.ReadToEnd(); return result; } //} return null; //} } catch { return null; } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// Post請求返回字元 /// </summary> /// <param name="url">請求地址</param> /// <param name="postData">請求資料</param> /// <returns>字元</returns> public static string PostResponse(string url, object obj) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); string postData = JsonConvertTool.SerializeObject(obj); HttpContent httpContent = new StringContent(postData); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string result = reader.ReadToEnd(); return result; } else { //LogHelper.WriteInfo(typeof(HttpClientHelper), "結果:" + response.StatusCode + "內容:" + JsonConvertTool.SerializeObject(obj)); } //} return null; //} } catch (Exception exception) { //LogHelper.Error("結果:異常 內容:" + JsonConvertTool.SerializeObject(obj) + "ex:" + exception.Message, exception); return null; } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// Post請求返回實體 /// </summary> /// <param name="url">請求地址</param> /// <param name="postData">請求資料</param> /// <returns>實體</returns> public static T PostResponse<T>(string url, string postData) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); HttpContent httpContent = new StringContent(postData); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); T result = default(T); Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string s = reader.ReadToEnd(); result = JsonConvertTool.DeserializeObject<T>(s); } //} return result; //} } catch { return default(T); } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// Post請求返回實體 /// </summary> /// <param name="url">請求地址</param> /// <param name="postData">請求資料</param> /// <returns>實體</returns> public static T PostResponse<T>(string url, object obj) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); string postData = JsonConvertTool.SerializeObject(obj); HttpContent httpContent = new StringContent(postData); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); T result = default(T); Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string s = reader.ReadToEnd(); result = JsonConvertTool.DeserializeObject<T>(s); } //} return result; //} } catch { return default(T); } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// Put請求返回字元 /// </summary> /// <param name="url">請求地址</param> /// <param name="postData">請求資料</param> /// <returns>字元</returns> public static string PutResponse(string url, object obj) { HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }); HttpResponseMessage response = null; try { //using (HttpClient httpClient = new HttpClient()) //{ httpClient.MaxResponseContentBufferSize = 256000; httpClient.DefaultRequestHeaders.Add("user-agent", userAgen); httpClient.CancelPendingRequests(); httpClient.DefaultRequestHeaders.Clear(); string postData = JsonConvertTool.SerializeObject(obj); HttpContent httpContent = new StringContent(postData); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent); taskResponse.Wait(); response = taskResponse.Result; //using (HttpResponseMessage response = taskResponse.Result) //{ //HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result; if (response.IsSuccessStatusCode) { Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync(); taskStream.Wait(); System.IO.Stream dataStream = taskStream.Result; System.IO.StreamReader reader = new System.IO.StreamReader(dataStream); string result = reader.ReadToEnd(); return result; } //} return null; //} } catch { return null; } finally { if (response != null) { response.Dispose(); } if (httpClient != null) { httpClient.Dispose(); } } } /// <summary> /// 將Http狀態碼翻譯為對應的中文【暫未使用】 /// </summary> /// <param name="code">Http狀態碼</param> /// <returns>中文解析</returns> public static string ToChsText(HttpStatusCode code) { switch (code) { case HttpStatusCode.Continue: return "請求者應繼續進行請求"; case HttpStatusCode.SwitchingProtocols: return "請求者已要求伺服器切換協議,伺服器已確認並準備進行切換"; case HttpStatusCode.OK: return "伺服器成功處理了相應請求"; case HttpStatusCode.Created: return "請求成功且伺服器已建立了新的資源"; case HttpStatusCode.Accepted: return "伺服器已接受相應請求,但尚未對其進行處理"; case HttpStatusCode.NonAuthoritativeInformation: return "伺服器已成功處理相應請求,但返回了可能來自另一來源的資訊"; case HttpStatusCode.NoContent: return "伺服器已成功處理相應請求,但未返回任何內容"; case HttpStatusCode.ResetContent: return "伺服器已成功處理相應請求,但未返回任何內容,但要求請求者重置文件檢視"; case HttpStatusCode.PartialContent: return "伺服器成功處理了部分 GET 請求"; case HttpStatusCode.MultipleChoices: return "伺服器可以根據請求來執行多項操作"; case HttpStatusCode.Moved: return "請求的網頁已永久移動到新位置"; case HttpStatusCode.Redirect: return "伺服器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求"; case HttpStatusCode.RedirectMethod: return "當請求者應對不同的位置進行單獨的 GET 請求以檢索響應時,伺服器會返回此程式碼"; case HttpStatusCode.NotModified: return "請求的網頁自上次請求後再也沒有修改過"; case HttpStatusCode.UseProxy: return "請求者只能使用代理訪問請求的網頁"; case HttpStatusCode.Unused: return "Unused 是未完全指定的 HTTP/1.1 規範的建議擴充套件"; case HttpStatusCode.RedirectKeepVerb: return "伺服器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求"; case HttpStatusCode.BadRequest: return "伺服器未能識別請求"; case HttpStatusCode.Unauthorized: return "請求要求進行身份驗證"; case HttpStatusCode.PaymentRequired: return "保留 PaymentRequired 以供將來使用"; case HttpStatusCode.Forbidden: return "伺服器拒絕相應請求"; case HttpStatusCode.NotFound: return "伺服器找不到請求的資源"; case HttpStatusCode.MethodNotAllowed: return "禁用相應請求中所指定的方法"; case HttpStatusCode.NotAcceptable: return "無法使用相應請求的內容特性來響應請求的網頁"; case HttpStatusCode.ProxyAuthenticationRequired: return "請求者應當使用代理進行授權"; case HttpStatusCode.RequestTimeout: return "伺服器在等待請求時超時"; case HttpStatusCode.Conflict: return "伺服器在完成請求時遇到衝突"; case HttpStatusCode.Gone: return "請求的資源已被永久刪除"; case HttpStatusCode.LengthRequired: return "伺服器不會接受包含無效內容長度標頭欄位的請求"; case HttpStatusCode.PreconditionFailed: return "伺服器未滿足請求者在請求中設定的其中一個前提條件"; case HttpStatusCode.RequestEntityTooLarge: return "伺服器無法處理相應請求,因為請求實體過大,已超出伺服器的處理能力"; case HttpStatusCode.RequestUriTooLong: return "請求的 URI 過長,伺服器無法進行處理"; case HttpStatusCode.UnsupportedMediaType: return "相應請求的格式不受請求頁面的支援"; case HttpStatusCode.RequestedRangeNotSatisfiable: return "如果相應請求是針對網頁的無效範圍進行的,那麼伺服器會返回此狀態程式碼"; case HttpStatusCode.ExpectationFailed: return "伺服器未滿足“期望”請求標頭欄位的要求"; case HttpStatusCode.InternalServerError: return "伺服器內部遇到錯誤,無法完成相應請求"; case HttpStatusCode.NotImplemented: return "請求的功能在伺服器中尚未實現"; case HttpStatusCode.BadGateway: return "伺服器作為閘道器或代理,從上游伺服器收到了無效的響應"; case HttpStatusCode.ServiceUnavailable: return "目前伺服器不可用(由於超載或進行停機維護)"; case HttpStatusCode.GatewayTimeout: return "伺服器作為閘道器或代理,未及時從上游伺服器接收請求"; case HttpStatusCode.HttpVersionNotSupported: return "伺服器不支援相應請求中所用的 HTTP 協議版本"; default: return "未知Http狀態"; } } } }