Jexus 踩坑日记其一
.NET Core这么香,我相信现在应该没人使用 .NET Framework 来开发新项目了吧,也不会有人用 Jexus 部署 .NET 项目了吧。 ——鲁迅
缘起
项目用 .NET Framework 开发,部署在 Jexus 服务。
旧项目维护中,为了接入第三方系统,使用 HttpWebRequest 对外发起请求,本地服务器测试通过。但托管在 Jexus 服务后,程序报错……
[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;
}
原因分析
- 既然堆栈显示是 set_Accept 报错 > 把
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 托管的程序员还好。
4 声望
0 粉丝
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。