-2

最近,我的生产环境遇到了一个奇怪的行为,我无法理解它背后的原因或原因。我在本地环境中实现了完全相同的代码,并且可以正常调试它而没有任何问题。它很少发生在我的生产环境中。

在进一步调试我的生产环境后,我发现问题出在string format.

所以我用值构建一个字符串取自web.config

var HereIsTheProblem = string.Format("client_id={0}&username={1}&password={2}",
                                     TakenFromConfig("abc"),
                                     TakenFromConfig("bcd"),
                                     TakenFromConfig("cde"));

当我尝试打印这个HereIsTheProblem变量时,它甚至不会打印任何东西,就像每次代码遇到这个变量时,它都会跳过它并且什么也不做。

为了检查问题不是由配置引起的,我从配置中取值,并string.Format立即将其放入

var HereIsTheProblem = string.Format("client_id={0}&username={1}&password={2}",
                                     "abcderfg-1231kasd-1231sad-znasda",
                                     "username",
                                     "password");

它仍然遇到相同的行为。进一步调试后,我注意到问题在于第一个带有破折号的值。只要它有1个或更多破折号,就会遇到上述问题,但是当我删除破折号时,不会发生此问题。

进一步解释这是多么奇怪,是这种问题在一段时间内突然发生(没有我们部署或更新我们的代码),并且没有我们修复它,它会在一段时间后自行恢复

有人知道这段代码背后发生了什么吗?

编辑:此代码用于 ASP.NET 并放入 IIS

EDIT2:这就是我将变量打印到日志文件中的方式。这就是我打印它的方式。

FileStream fs = File.Open(strFileName, FileMode.Append, FileAccess.Write, 
FileShare.ReadWrite);
StreamWriter myWriter = new StreamWriter(fs);
myWriter.WriteLine(WriteAnyLogHere);

此变量还用作要通过 发送的请求正文httpWebRequest。然后HttpWebResponse就没有对象就回来了

编辑 3:这是我使用HereIsTheProblem变量的实际代码。日志记录仅用于调试它

string URL = "URL";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = 300000;
httpWebRequest.Accept = "text/html";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string HereIsTheProblem = "From Above Description";
    streamWriter.Write(HereIsTheProblem);
    streamWriter.Flush();
}
try
{
    using (var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            result = streamReader.ReadToEnd();
        }
    }
}
catch (WebException ex)
{
    using (var httpResponse = (HttpWebResponse)ex.Response)
    {
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            result = streamReader.ReadToEnd();
        }
    }
}
4

1 回答 1

-1

这是一个非常奇怪的错误,无论如何我都会将 string.Format(...) 替换为以下字符串的串联:

    var HereIsTheProblem = "client_id=" + TakenFromConfig("abc") + "&username=" + 
    TakenFromConfig("bcd") + "&password=" + TakenFromConfig("cde"));
于 2020-12-24T11:26:56.653 回答