我们的环境有多个Web服务器在负载均衡器后面运行。如果我修改我的主机文件直接转到将绕过负载均衡器的Web服务器,HttpWebRequest工作正常。如果我删除我的主机文件中的条目并让请求通过负载均衡器它返回404.但是,如果我在同一台计算机上使用一个简单的.html文件执行相同的请求我从它运行HttpWebRequest一切正常我的主机文件中是否有条目。
有什么想法可以通过浏览器(Chrome)使用html文件,而不是HttpWebRequest?
请求是一个POST请求,用于上传文件和其他3个参数。
提前感谢任何想法。
编辑:我尝试将我的UserAgent设置为Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
,这是我在使用html文件时发送的内容。
这是我正在使用的功能,当混合中没有负载均衡器时,当前正在运行:
private void PostFileToWebServer(byte[] file)
{
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
var request = (HttpWebRequest)WebRequest.Create(_url);
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
request.KeepAlive = true;
//Time in milliseconds
request.Timeout = 1200000;
request.Host = "ourdomain.com";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
request.CookieContainer = new CookieContainer(100000);
var memStream = new MemoryStream();
byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
string formDataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach(var key in _parameters.AllKeys)
{
string formData = string.Format(formDataTemplate, key, _parameters[key]);
byte[] formDataBytes = Encoding.UTF8.GetBytes(formData);
memStream.Write(formDataBytes, 0, formDataBytes.Length);
memStream.Write(boundarybytes, 0, boundarybytes.Length);
}
string header = string.Format("Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\n Content-Type: application/octet-stream\r\n\r\n", _fileName);
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
memStream.Write(headerBytes, 0, headerBytes.Length);
memStream.Write(file, 0, file.Length);
memStream.Write(boundarybytes, 0, boundarybytes.Length);
request.ContentLength = memStream.Length;
Stream requestStream = request.GetRequestStream();
memStream.Position = 0;
var tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close();
var response = request.GetResponse();
Stream stream2 = response.GetResponseStream();
var reader2 = new StreamReader(stream2);
System.Diagnostics.Debug.WriteLine(reader2.ReadToEnd());
response.Close();
}
编辑:我评论了request.ContentType = "multipart/form-data; boundary=" + boundary;
,它适用于负载均衡器。有人对此有解释吗?
答案 0 :(得分:0)
好的,我和Fiddler就成功通话和不成功通话之间的差异进行了长时间的讨论。 Fiddler说,从浏览器发送的成功调用的最后一个边界在它的末尾有一个额外的“ - ”。当我把它放在一起时,一切都与世界相吻合,我可以保持我的Content-Type设置不变。