- IIS 7.5/Windows Server 2008 R2
- 使用主机名绑定到同一IP地址的多个IIS站点。
- 网站的入口流量正常。
- 后端站点代码提出的出站Web请求失败。远程站点返回404(未发现)。
- 通过网络跟踪验证流量正在删除服务器。
- 如果使用专用IP地址从网站完成(即未共享其他任何网站),则相同的请求正常。
有人对如何进行这项工作有任何想法吗?
托管服务器上的网络跟踪:
网站的成功请求,带有非共享IP地址:
No. Time Source Destination Protocol Info
6366 15:54:35.590463 192.168.1.76 173.194.77.121 HTTP GET /key/value/one/two HTTP/1.1
6369 15:54:35.599879 173.194.77.121 192.168.1.76 TCP http > 55407 [ACK] Seq=1 Ack=110 Win=344 Len=0
6370 15:54:35.621587 173.194.77.121 192.168.1.76 HTTP HTTP/1.1 200 OK (application/json)
6608 15:54:35.815774 192.168.1.76 173.194.77.121 TCP 55407 > http [ACK] Seq=110 Ack=357 Win=509 Len=0
使用共享IP地址从网站上的请求失败:
No. Time Source Destination Protocol Info
9720 15:54:39.244192 192.168.1.80 173.194.77.121 HTTP GET /key/value/one/two HTTP/1.1
9760 15:54:39.256958 173.194.77.121 192.168.1.80 TCP [TCP segment of a reassembled PDU]
9761 15:54:39.256962 173.194.77.121 192.168.1.80 HTTP HTTP/1.1 404 Not Found (text/html)
9762 15:54:39.257027 192.168.1.80 173.194.77.121 TCP 55438 > http [ACK] Seq=212 Ack=1676 Win=512 Len=0
代码:
public static HttpWebRequest CreateWebRequest(string url, string method = "GET", string referer = null, string contentType = null, int timeout = 100000, string authentication = null, string bindToIpAddress = null, string host = null)
{
var request = (HttpWebRequest)WebRequest.Create(url);
if (!string.IsNullOrWhiteSpace(bindToIpAddress))
{
IPAddress bindIp;
if (!IPAddress.TryParse(bindToIpAddress, out bindIp))
{
throw new ArgumentException("bindToIpAddress");
}
request.ServicePoint.BindIPEndPointDelegate = ((sp, rep, rc) =>
{
return new IPEndPoint(bindIp, 0);
});
}
request.Accept = "*/*";
request.ContentType = contentType;
request.Referer = referer;
request.Method = method;
request.Timeout = timeout;
if (!string.IsNullOrWhiteSpace(host))
{
request.Host = host;
}
return request;
}
string GetData()
{
try
{
string result;
var request = CreateWebRequest("http://jsonplaceholder.typicode.com/posts/1",
"GET",
"somedomain.com",
timeout: (10 * 1000),
bindToIpAddress: "192.168.27.133" /*site IP*/);
request.Accept = "application/json";
using (var response = request.GetResponse())
{
using (var sr = new StreamReader(response.GetResponseStream()))
{
result = sr.ReadToEnd();
}
}
return result;
}
catch (Exception ex)
{
return null;
}
}
404响应从远程站点返回,因此远程站点无法处理您的请求,并且与本地服务器上的情况无关。
与远程站点的角度的唯一区别是发件人的IP地址,因此必须将其配置为仅从某些IP地址接受请求。此限制可以在远程服务器中,或者之间的任何防火墙,路由器或代理。
这是我们应用程序中的一个错误。在某些情况下,主机标头(请求上的主机属性)被设置不当(to主机/源站点的主机名)。问题中的删除代码样本没有显示出来。对于忽略标题的Web服务来说,这是很好的,对于其他不的其他问题是一个问题(404响应)。这个问题无需使用IIS或共享IP地址。感谢您的所有答复。