使用共享IP地址从IIS站点制作时出站Web请求失败


  • 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地址。感谢您的所有答复。

最新更新