.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