Jexus 踩坑日记其一

.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;
}

缘由分析

  • 既然堆栈显示是 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 托管的程序员还好。app

相关文章
相关标签/搜索