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

相關文章
相關標籤/搜索