POST случайным образом получает неожиданный ответ от сервера - PullRequest
0 голосов
/ 20 марта 2020

У моей компании есть программное обеспечение, которое включает веб-сайт / API IIS и приложение windows, которое отправляет данные в API для хранения в базе данных с помощью POST. Этот процесс прекрасно работает в 98% случаев, но для некоторых клиентов POST иногда дает неожиданное значение.

Это код POST Windows клиентского приложения:

private string PostData(string uri, string data, string responseType)
{
    var request = (HttpWebRequest)WebRequest.Create(uri);
    request.Accept = responseType;
    request.UseDefaultCredentials = true;
    request.Method = "POST";
    request.Timeout = 900000;
    request.KeepAlive = false;

    byte[] byteArray = Encoding.UTF8.GetBytes(data);
    request.ContentLength = byteArray.Length;

    using (Stream dataStream = request.GetRequestStream())
    {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }

    string returnval = "-1";
    try
    {
        var response = (HttpWebResponse)request.GetResponse();
        using (var dataStream = response.GetResponseStream())
        {
            using (var reader = new StreamReader(dataStream))
                returnval = reader.ReadToEnd();
        }
        response.Close();
    }
    catch (WebException webex)
    {
        LogException(webex);
    }
    catch (Exception ex)
    {
        LogException(ex, "Post Data (get response)");
    }

    return returnval;
}

Типичные аргументы этого вызова:

var uri = "https://example.com/Remote/InsertGenericPoint/?type=PointExLogical"; 
var data = "[data to be written to database]"; 
var responseType = "text/plain";

В API сервера это код, который обрабатывает запрос POST:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public bool InsertGenericPoint(string type)
{
    try
    {
        IList<IInsertable> data = new List<IInsertable>();

        switch (type.ToLower())
        {
            case "pointexlogical":
                // Deserialize the input stream into a list of point readings.
                data = Deserializer.Deserialize<PointExLogical>("PointExLogicals", Request.InputStream);
                break;

            // code removed for brevity
        }

        var success = true;
        using (var conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (var cmd = new SqlCommand("", conn))
            {
                if (data != null)
                {
                    for (int i = 0; i < data.Count; i++)
                    {
                        try
                        {
                            data[i].Insert(cmd);
                        }
                        catch
                        {
                            success = false;
                        }
                    }
                }
            }
        }

        return success;
    }
    catch
    {
        return false;
    }
}

После добавления кода регистрации на стороне клиента большинство времени я вижу, что возвращаемое значение из вызова PostData () в приложении Windows является «True».

PostData
  URI: https://example.com/Remote/InsertGenericPoint/?type=PointExLogical
  Response type: text/plain
Data sent - getting response...
Response received --> True

Редко когда-либо «False», но иногда возвращаемое значение содержимое файла Windows .Master javascript для веб-сайта!

PostData
  URI: https://example.com/Remote/InsertGenericPoint/?type=PointExNumeric
Response type: text/plain
Data sent - getting response...
Response received --> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
    <head id="ctl00_Head1"><meta http-equiv="X-UA-Compatible" content="IE=edge;FF=3;chrome=1;OtherUA=4" />
    <meta http-equiv="CACHE-CONTROL" content="NO-CACHE" />

    <link href="/Content/reset-min.css?v=2.3.0.530" rel="stylesheet" type="text/css" />
    <link href="/Content/ext-all.css?v=2.3.0.530" rel="stylesheet" type="text/css" />
    <link href="/Content/xtheme-gray.css?v=2.3.0.530" rel="stylesheet" type="text/css" />
    <link href="/Content/Site.css?v=2.3.0.530" rel="stylesheet" type="text/css" />

Конечно, попытка интерпретировать этот ответ как логическое значение вызывает проблемы. Я не могу сказать, удалось ли серверу добавить запись в базу данных. Добавление регистрации на стороне сервера не выявило ничего плохого. Никаких исключений не выбрасывается.

Мне не удалось определить, что послужило бы причиной такого типа ответа. Это сбой на стороне сервера? Если так, как я могу поймать и предотвратить это? Код клиента или сервера неправильно настроен?

Есть еще идеи?

Обновление: я только что получил другой файл журнала от клиента, который показывает, что сервер ответил тем же кодом Windows .Master javascript в ответ на другой запрос, который использует WebClient.DownloadString ():

private bool GetWinAuthEnabledSetting()
{
    var winAuthEnabled = false;
    using (var webClient = new WebClient())
    {
        webClient.UseDefaultCredentials = true;
        try
        {
            var response = webClient.DownloadString(new Uri(uri, "Remote/WinAuthEnabled"));
            if (response.Equals("1"))
                winAuthEnabled = true;
        }
        catch (Exception ex)
        {
            LogException(ex);
        }
    }
    return winAuthEnabled;
}

Ответ:

GetWinAuthEnabledSetting
Win Auth Response: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
    <head id="ctl00_Head1"><meta http-equiv="X-UA-Compatible" content="IE=edge;FF=3;chrome=1;OtherUA=4" />
    <!-- http://msdn.microsoft.com/en-us/library/cc288325%28v=vs.85%29.aspx -->
    <meta http-equiv="CACHE-CONTROL" content="NO-CACHE" />
    <!-- Include all core CSS files -->
    <link href="/Content/reset-min.css?v=2.3.0.530" rel="stylesheet" type="text/css" />
    <link href="/Content/ext-all.css?v=2.3.0.530" rel="stylesheet" type="text/css" />
    <link href="/Content/xtheme-gray.css?v=2.3.0.530" rel="stylesheet" type="text/css" />

Что происходит с сервером?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...