.NET Core這麼香,我相信如今應該沒人使用 .NET Framework 來開發新項目了吧,也不會有人用 Jexus 部署 .NET 項目了吧。 ——魯迅程序員
項目用 .NET Framework 開發,部署在 Jexus 服務。json
舊項目維護中,爲了接入第三方系統,使用 HttpWebRequest 對外發起請求,本地服務器測試經過。但託管在 Jexus 服務後,程序報錯……c#
[08:37:27 739] 【堆棧跟蹤】System.InvalidOperationException: request started at System.Net.HttpWebRequest.CheckRequestStarted () [0x00008] in <ff066898b05b4717ad7ef0e02ce822db>:0 at System.Net.HttpWebRequest.set_Accept (System.String value) [0x00000] in <ff066898b05b4717ad7ef0e02ce822db>:0 at (wrapper remoting-invoke-with-check) System.Net.HttpWebRequest.set_Accept(string)
源碼主要以下服務器
// ... HttpWebRequest request = WebRequest.Create(GetURL(headerInfo.url, null)) as HttpWebRequest; request.Method = requestType; request.Timeout = 15000; using (var s = request.GetRequestStream()) { byte[] dataBytes = Encoding.UTF8.GetBytes(requestBody); s.Write(dataBytes, 0, dataBytes.Length); } // ... 中間處理了一些頭部信息 request.Accept = "application/json"; request.ContentType = "application/json"; request.Headers.Add(AUTH, authHeaderValue); request.Headers.Add(TOKEN, headerInfo.token); try { HttpWebResponse response = request.GetResponse() as HttpWebResponse; using(var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } catch(Exception e) { logger.Error(e, "REQUEST FAILED"); return null; }
request.Accept = "application/json";
去掉 > 經過request started
,猜想是請求已經開始,這是和 IIS 服務器有差別的地方,那麼極可能 Jexus 託管下 request.GetRequestStream()
請求就算開始,此時不容許從新設置 Accept
> 把request.Accept = "application/json";
放到request.Timeout = 15000;
以後 > 經過// ... HttpWebRequest request = WebRequest.Create(GetURL(headerInfo.url, null)) as HttpWebRequest; request.Method = requestType; request.Timeout = 15000; // 修改之處 request.Accept = "application/json"; request.ContentType = "application/json"; // 修改之處 using (var s = request.GetRequestStream()) { byte[] dataBytes = Encoding.UTF8.GetBytes(requestBody); s.Write(dataBytes, 0, dataBytes.Length); } // ... 中間處理了一些頭部信息 request.Headers.Add(AUTH, authHeaderValue); request.Headers.Add(TOKEN, headerInfo.token); try { HttpWebResponse response = request.GetResponse() as HttpWebResponse; using(var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } catch(Exception e) { logger.Error(e, "REQUEST FAILED"); return null; }
但願用 Jexus 託管的程序員還好。app