C#MVC4请求失败

C#MVC4请求失败,c#,asp.net-mvc,amazon-web-services,asp.net-mvc-4,C#,Asp.net Mvc,Amazon Web Services,Asp.net Mvc 4,我在生产中遇到了一点HTTP调用问题。以下是场景: 我们有一个通过HTTP请求与web服务器通信的桌面应用程序。这与下面QA中服务器端和客户端的代码简介配合得很好。现在,我们从一个内部托管的IIS迁移到AWS,并将其投入使用(相同的配置,IIS7/Server 2016,所有IP都允许在AWS上使用端口443/80),它现在可以工作一半了。用户可以从客户端应用程序远程登录和身份验证,但在生产环境中,某些调用甚至无法到达控制器上的方法(挂起几秒钟后返回500错误,而正常工作的调用会立即通过)。我很

我在生产中遇到了一点HTTP调用问题。以下是场景:

我们有一个通过HTTP请求与web服务器通信的桌面应用程序。这与下面QA中服务器端和客户端的代码简介配合得很好。现在,我们从一个内部托管的IIS迁移到AWS,并将其投入使用(相同的配置,IIS7/Server 2016,所有IP都允许在AWS上使用端口443/80),它现在可以工作一半了。用户可以从客户端应用程序远程登录和身份验证,但在生产环境中,某些调用甚至无法到达控制器上的方法(挂起几秒钟后返回500错误,而正常工作的调用会立即通过)。我很难理解它,因为我相信它会在QA(网络问题或其他问题)中完全失败,在一个地方不起作用,但在下一个地方不起作用

DB连接已验证(能够提取用户帐户/进行身份验证)。所有外部DLL都是最新的(每次推送新版本时都会烧掉旧文件以避免停滞)、443/80上的已验证连接、同一控制器上的其他方法都在工作,并且所有内容都在QA中工作

[新密码类别]

[Serializable]
    public class NewPassword
{
        public int UserID { get; set; }

        public string Password { get; set; }

        public string Location { get; set; }

        public string Username { get; set; }

        public string Name { get; set; }

        public string UserPassword { get; set; }

        public int PasswordID { get; set; }
}
[控制器代码] (控制器路径为/API/)

[客户代码]

internal static Status CreatePassword(UserAccount Account, Password Credential)
{
    try
    {
        HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://" + Methods.Session.Connection.ServerName + "/API/CSCreate");
        Request.ContentType = "application/json";
        Request.Method = "POST";
        using (StreamWriter SW = new StreamWriter(Request.GetRequestStream()))
        {
            NewPassword Data = new NewPassword() { UserID = Account.ID, Password = Credential.Text, Username = Credential.Username, Location = Credential.Location, UserPassword = Account.Password, Name = Credential.Name };
            string JSON = new JavaScriptSerializer().Serialize(Data);
            SW.Write(JSON);
        }
        HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
        using (StreamReader SR = new StreamReader(Response.GetResponseStream()))
        {
            string Data = SR.ReadToEnd();
            Status EndData = (Status)new JavaScriptSerializer().Deserialize(Data, typeof(Status));
            if (EndData.ExitCode != 200) return new Status() { ExitCode = 400, ExitMessage = EndData.ExitMessage };
            else return new Status() { ExitCode = 200, ExitMessage = EndData.ExitMessage };
        }
    }
    catch (Exception Ex)
    {
        return new Status() { ExitCode = 500, ExitMessage = "Unable to update your account. An error occurred. Please try again later." };
    }
}

有趣的是,(500)响应提到了GET方法,即使请求信息中指定了“POST”。尝试使用not allowed(在给定属性的情况下这是有意义的)将PUT或GET方法出错(GET原因很明显)。这一点我完全被难住了。

“有趣的是,(500)响应提到了一个GET方法,即使在AJAX信息中指定了“GET”。那是打字错误吗?听起来你在第二种情况下是指“发布”吗?顺便说一句,这些都不是AJAX。AJAX请求描述了一个异步请求,该请求是由JavaScript代码启动的浏览器发出的,超出了正常的页面刷新周期,并且有一些自身的复杂性,在这里不适用。你在这里做的只是一个普通的HTTP请求,由一些C代码生成。没错,这是一个输入错误。是的,我在生产中的一个网页的AJAX调用中也遇到了同样的问题,所以我在键入时没有考虑就将其与之关联:)。啊,好的,这是有道理的。那么,这500人到底说了什么?通常情况下,您只会得到“内部服务器错误”,其他什么都没有。听起来您确实需要在服务器应用程序中进行更详细的日志记录,不过,AWS基础设施以及两者之间的网络是明显的区别,因此您可能需要尝试缩小问题的范围。您是否使用负载平衡?如果“某些调用失败”,您的意思是某些用户可以进行身份验证,而其他用户无法进行身份验证,那么一台服务器配置错误可能会导致这种行为。最终,如果代码在一个环境中工作,而不是在另一个环境中工作,那么它是代码外部的东西,人们只能猜测。因此,这并不是一个可以客观回答的问题。没有负载平衡,它是与单个服务器的直接连接,模仿我们内部测试服务器的设置。每次身份验证调用成功,上述每次引用调用都失败-两者都在同一控制器上,在同一服务器上。这是没有意义的,似乎也是一个软件问题。”有趣的是,(500)响应中提到了一个GET方法,即使AJAX信息中指定了“GET”。那是打字错误吗?听起来你在第二种情况下是指“发布”吗?顺便说一句,这些都不是AJAX。AJAX请求描述了一个异步请求,该请求是由JavaScript代码启动的浏览器发出的,超出了正常的页面刷新周期,并且有一些自身的复杂性,在这里不适用。你在这里做的只是一个普通的HTTP请求,由一些C代码生成。没错,这是一个输入错误。是的,我在生产中的一个网页的AJAX调用中也遇到了同样的问题,所以我在键入时没有考虑就将其与之关联:)。啊,好的,这是有道理的。那么,这500人到底说了什么?通常情况下,您只会得到“内部服务器错误”,其他什么都没有。听起来您确实需要在服务器应用程序中进行更详细的日志记录,不过,AWS基础设施以及两者之间的网络是明显的区别,因此您可能需要尝试缩小问题的范围。您是否使用负载平衡?如果“某些调用失败”,您的意思是某些用户可以进行身份验证,而其他用户无法进行身份验证,那么一台服务器配置错误可能会导致这种行为。最终,如果代码在一个环境中工作,而不是在另一个环境中工作,那么它是代码外部的东西,人们只能猜测。因此,这并不是一个可以客观回答的问题。没有负载平衡,它是与单个服务器的直接连接,模仿我们内部测试服务器的设置。每次身份验证调用成功,上述每次引用调用都失败-两者都在同一控制器上,在同一服务器上。这是没有意义的,似乎也是一个软件问题。
internal static Status CreatePassword(UserAccount Account, Password Credential)
{
    try
    {
        HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://" + Methods.Session.Connection.ServerName + "/API/CSCreate");
        Request.ContentType = "application/json";
        Request.Method = "POST";
        using (StreamWriter SW = new StreamWriter(Request.GetRequestStream()))
        {
            NewPassword Data = new NewPassword() { UserID = Account.ID, Password = Credential.Text, Username = Credential.Username, Location = Credential.Location, UserPassword = Account.Password, Name = Credential.Name };
            string JSON = new JavaScriptSerializer().Serialize(Data);
            SW.Write(JSON);
        }
        HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
        using (StreamReader SR = new StreamReader(Response.GetResponseStream()))
        {
            string Data = SR.ReadToEnd();
            Status EndData = (Status)new JavaScriptSerializer().Deserialize(Data, typeof(Status));
            if (EndData.ExitCode != 200) return new Status() { ExitCode = 400, ExitMessage = EndData.ExitMessage };
            else return new Status() { ExitCode = 200, ExitMessage = EndData.ExitMessage };
        }
    }
    catch (Exception Ex)
    {
        return new Status() { ExitCode = 500, ExitMessage = "Unable to update your account. An error occurred. Please try again later." };
    }
}