代码之家  ›  专栏  ›  技术社区  ›  Oscar Cabrero

无法在.net中发布https WebRequest?

  •  1
  • Oscar Cabrero  · 技术社区  · 17 年前

    以下是我收到的错误

    1.-基础连接已关闭:无法连接到远程服务器。

    2.-操作超时

    3-基础连接已关闭:无法为SSL/TLS建立安全通道。

    我尝试了我的公司和客户公司的大约3或4个不同的代理,甚至当我直接与ISP提供商联系时,没有任何限制,我在执行以下方法时也会出现上述错误

    WebRequest.GetRequestStream() 
    

    无论是否在代理后发生,请求只能从代理后的一台PC成功发布。代理未安装客户端证书。

    请求已包含网络凭据。

    可能是什么?

    使现代化

    函数已成功完成,但必须再次调用才能完成上下文

    documentation 此错误属于

    //
    // MessageId: SEC_I_CONTINUE_NEEDED
    //
    // MessageText:
    //
    //  The function completed successfully, but must be called
    //  again to complete the context
    //
    #define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)
    

    在…上 MSDN 这是指

    需要继续吗 客户端必须将输出令牌发送到服务器并等待返回令牌。然后将返回的令牌传递到另一个InitializeSecurityContext(Schannel)调用中。输出令牌可以为空。

    这是否意味着电脑缺少客户端证书?

    4 回复  |  直到 17 年前
        1
  •  1
  •   Scott Wegner    17 年前

    有许多事情可能会使事情变得复杂,比如与SSL证书不一致等。但首先,您应该进行一些基本调试,以排除明显的问题:

    --您是否尝试从其他计算机或其他网络连接?您提到客户是在代理的后面;首先尝试一台没有代理的计算机,以排除这种可能性。

    --您是否在会话中发出多个Web请求?打开请求的数量有一个硬限制,因此请确保在收到WebResponse后关闭它们。也许只需要一个请求就可以编写一个测试程序。

        2
  •  1
  •   csgero    17 年前

    您可以使用 Fiddler 或者网络数据包嗅探工具,如 Ethereal Whireshark 在工作的机器上,以及在其他机器上,并比较结果。这是相当低的级别,但可能会对这个问题有所帮助。

        3
  •  1
  •   Andrew Cox    17 年前

    在窗户上,那将是

    telnet <domainname> 443
    

    如果连接,屏幕将变为空白(点击返回几次退出)

    • 如果您的请求在HTTPS下,代理可能关心您的请求,也可能不关心您的请求,因为他们无法读取请求。

        4
  •  0
  •   Sani Huttunen    17 年前

    SSL证书名称可能不匹配。自签名证书通常就是这种情况。

    解决方案是编写自己的身份验证例程,在该例程中,您要么始终返回true,要么执行必要的身份验证以确保证书有效。

    // .NET 2.0+
    ...
    ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
    ...
    public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
    {
      return true;
    }
    
    // .NET 1.1
    public class MyCertificatePolicy : ICertificatePolicy
    {
      public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
      {
        return true;
      }
    }
    ...
    ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
    ...