Azure中通过SSL的HTTPWebRequest大多失败-基础连接已关闭

Azure中通过SSL的HTTPWebRequest大多失败-基础连接已关闭,azure,ssl,Azure,Ssl,所以在Azure中有一个奇怪的问题,我们可以在上面使用一些帮助。我们已经利用SSL将其隔离为HTTPWebRequest(POST-GET可以正常工作)。这个对我们客户的特殊请求在任何计算机上都能可靠地工作,然而,当我们启动Azure VM并运行它时,90-95%的时间都会失败。事实上,它的工作是什么使这一点如此困难 更奇怪的是,同样的请求,在Azure中,一旦被Fiddler代理,100%的时间都有效。已安装Fiddler以帮助调试,但无法重现该问题。退出Fiddler,问题再次出现 然而,最

所以在Azure中有一个奇怪的问题,我们可以在上面使用一些帮助。我们已经利用SSL将其隔离为HTTPWebRequest(POST-GET可以正常工作)。这个对我们客户的特殊请求在任何计算机上都能可靠地工作,然而,当我们启动Azure VM并运行它时,90-95%的时间都会失败。事实上,它的工作是什么使这一点如此困难

更奇怪的是,同样的请求,在Azure中,一旦被Fiddler代理,100%的时间都有效。已安装Fiddler以帮助调试,但无法重现该问题。退出Fiddler,问题再次出现

然而,最有可能与SSL有关的是,它能够工作的事实让我完全困惑。我们已经能够从Azure VM捕获成功的tracelog和失败的tracelog

基础连接已关闭:连接已关闭 想不到


另一个因素是,客户端使用了一个名为DataPower的产品,但不确定这是否只是此线程中的额外噪音。

在更改头以强制在头中传递凭据(通过)后,这绕过了问题

问题仍然存在,当来自Azure的连接使用NetWorkCredential时,客户端的IBM Datapower正在重置连接(例如,req.Credentials=new NetWorkCredential)

我们无法解释为什么当我们在本地机器上运行代码时,DataPower不会删除请求,但是,当它在Azure中时,它会删除请求


至少我们有一个解决办法,如果我听到关于DataPower问题的任何反馈,我们会让你知道的。

好吧,我只是花了六个小时想我是在疯狂地追逐类似的东西。在我的例子中,我使用DotNetOpenAuth进行单点登录实现,就像我的其他五台服务器一样。但这台新服务器99%的时间都会呕吐:

DotNetOpenAuth.Messaging.ProtocolException: Error occurred while sending a direct message or getting the response. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security._SslStream.StartFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.TlsStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   --- End of inner exception stack trace ---
   at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   at DotNetOpenAuth.Messaging.UntrustedWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   at DotNetOpenAuth.Yadis.Yadis.Request(IDirectWebRequestHandler requestHandler, Uri uri, Boolean requireSsl, String[] acceptTypes)
   at DotNetOpenAuth.Yadis.Yadis.Discover(IDirectWebRequestHandler requestHandler, UriIdentifier uri, Boolean requireSsl)
   at DotNetOpenAuth.OpenId.UriDiscoveryService.Discover(Identifier identifier, IDirectWebRequestHandler requestHandler, Boolean& abortDiscoveryChain)
   at DotNetOpenAuth.OpenId.IdentifierDiscoveryServices.Discover(Identifier identifier)
   at DotNetOpenAuth.OpenId.RelyingParty.AuthenticationRequest.Create(Identifier userSuppliedIdentifier, OpenIdRelyingParty relyingParty, Realm realm, Uri returnToUrl, Boolean createNewAssociationsAsNeeded)
要真正质疑我的理智

  • 在Web浏览器中访问SSL端点效果很好
  • 打开Fiddler捕获使其工作,关闭它使其不工作
  • 它确实在大约1%的时间里独自工作
  • 在控制台应用程序中对同一个端点使用
    HttpWebRequest
    是可行的,但切换到DotNetOpenAuth(它似乎在做或多或少相同的事情)导致它大部分不起作用
在检查了所有可能检查的内容后,我进入网络适配器属性(在我的例子中,是机架空间云上的Citrix PV以太网适配器),单击配置,转到高级,并禁用IPv4校验和卸载。然后它立即开始工作


我不知道IPv4校验和卸载的作用,但它在这个虚拟机上不能可靠地工作。希望这对其他人有帮助

尼古拉斯。。。这无疑修复了我的“底层连接关闭”错误,但由于禁用IPv4校验和卸载,下载速度已降至1kb/s左右。嗯,我没有看到这一点,但我确实禁用了所有卸载功能,而不仅仅是IPv4校验和卸载。当我提出Rackspace支持问题时,他们建议关闭Windows服务器的卸载。(以前默认情况下是禁用的,但我认为他们在新的Performance server映像中忽略了这个细节。)你说得完全正确。实际上,我在发布回复后不久就禁用了其余部分,它完全解决了问题。再次感谢,在找到您的解决方案之前,我一直认为我的代码出了问题。