我正在使用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服务器/配置的支配。
这很有效。 99%的时间(请求非常频繁地运行)。随便,我会得到400个不好的请求。 logfiles \ HTTPERR显示“ - 主机名 - ”
的原因client.DownloadData使用标准的fqdn URL并且没有自定义标头可靠地工作(DNS失败时除外)
为了比较两种类型的请求,我将客户端指向/phpinfo.php
没有差异。
这种方法如何在99%的时间内起作用,但随机失败?
编辑:“DNS缓存”始终返回IP,我确信这一点。
更新:我改进了日志记录,当时是响应并请求数据
Reuqest: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错误。
答案 0 :(得分:0)
我没有理解我实际上在轻微通信失败(ConnectFailure,Timeout等)的情况下调用DownloadData 4重试次数。
client.Headers
被消耗,必须重新添加。
我希望这篇文章可以帮助将来的某个人。