IIS随机错误请求-主机名


IIS Random bad requests - Hostname

我正在使用C#调用一个简单的iis、php、json api。我通过IP调用它,并手动传递主机标头,如下所示

var webhost = "api.srv.com";
var webhostip = <get ip from my own dns cache>;
var client = new WebClient();
client.Headers.Add( "Host", webhost );
response = client.DownlodData("https://" + webhostip + "/etcetc.php");

我正在使用一个更可靠的dns缓存,我已经建立在应用程序中。我不想任由糟糕的DNS服务器/config摆布。

这是有效的。99%的时间(请求运行非常频繁)。不过,我会随机收到400个坏请求。logfiles''HTTPERR显示"-Hostname-"的原因

client.DownloadData使用标准的fqdn URL,没有自定义标头可靠工作(DNS失败时除外)

为了比较这两种类型的请求,我将客户端指向/phpinfo.php

没有区别。

这种方法如何在99%的时间内都有效,但却随机失败?

编辑:"DNS缓存"总是返回IP,我确信这一点。

更新:我改进了日志记录,这是时的响应和请求数据

Reqest:https://1.2.3.4/apidir/script.php?p1=xxxx&p2=xx%20xxx

标题:'Host': 'api.srv.com:445'

响应,来自WebException.Response.GetResponseStream:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>

此请求每分钟运行一次,只有偶尔会失败!

请求时间通常为60-90秒。WebClient上的超时时间为100秒。当使用正常的fqdn方法时,我确实会遇到超时,但它们从不显示为400。

更新:我启用了loggin,以便在问题发生时捕获完整的跟踪。

在经历了几次之后(由于我国出色的互联网):

System.Net Error: 0 : [2776] Exception in HttpWebRequest#50710248::GetResponse - Unable to connect to the remote server.
   at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
   at System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
   at System.Net.Connection.CompleteStartConnection(Boolean async, HttpWebRequest httpWebRequest)

我让连接池尝试重新建立连接(如Keep-Alive所示),但它无法使用我指定的头。

System.Net Information: 0 : [2776] ConnectStream#5673090 - Sending headers
Host: 1.2.3.4:445
Connection: Keep-Alive

我怀疑是.Net WebClient错误。

在发生轻微通信故障(ConnectFailure、Timeout等)的情况下,我实际上调用了DownloadData 4次重试,这一事实没有得到认可。

client.Headers被消耗,必须重新添加。

我希望这篇文章对将来的人有所帮助。