我在生产中遇到了一些HTTP调用问题。这是场景:
我们有一个桌面应用程序,可通过HTTP请求与Web服务器通信。这在QA中服务器和客户端上的代码模糊下工作正常。现在我们从内部托管的IIS迁移到AWS并将其投入实时(相同的配置,IIS7 / Server 2016,AWS允许所有IP的端口443/80),它现在已经完成了一半。用户可以从客户端应用程序远程登录和进行身份验证,但是某些调用甚至无法到达控制器上的方法(在挂起几秒钟后返回500错误,而在生产中立即执行调用)。我无法理解它,因为我相信它会在QA中完全失败(无论是网络问题还是其他问题),而不是在一个地方而不是在下一个地方工作。
验证数据库连接(能够提取用户帐户/进行身份验证)。所有外部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 /)
[HttpPost] // Does not work with or without HttpPost attribute
[ValidateInput(false)] // disabled for testing, did not help
public JsonResult CSCreate(NewPassword Data)
{
}
[客户代码]
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." };
}
}
有趣的是,即使" POST"在请求信息中指定。尝试使用不允许的PUT或GET方法错误(出于明显原因的GET)(这在给定属性时是有意义的)。我完全不知道这个。