c# - URL 中的 httpWebRequest 授权问题

c# - httpWebRequest Authorization problem in URL

我是C#的新手,我希望你能帮助我解决我无法解决的授权问题。这让我抓狂了好几个星期。

任务很简单,我有一个服务器的 URL,当我通过基本授权输入时(只需用户 + 在弹出框中输入)显示一个 XML 我想保存到的文档文本。 该页面也有一些自签名证书。

更多信息以防万一有用,服务器是 Cisco Call Manager,他们 运行 开箱即用 Linux(因此完全不可能更改其编码) .

触发操作只是一个按钮,它从文本框中读取一些文本以获取 IP、用户和密码。

我做了很多研究,尝试了许多不同的代码和请求方式,但它们都以相同的代码失败。最后,我尝试使用的代码如下。

这是我的代码:

        string username = "user";
        string password = "password";

        var request = WebRequest.Create("http://serverIP/ast/ASTIsapi.dll?GetPreCannedInfo&Items=getServiceInfoRequest");

        //I use this to bypass the certificate validation errors
        ServicePointManager.ServerCertificateValidationCallback = delegate (object envio, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

        //Convert the user:password into Base64
        string encoded = System.Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
        request.Headers.Add("Authorization", "Basic " + encoded);
        var response = request.GetResponse();
        Stream receiveStream = response.GetResponseStream();
        StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
        var result = readStream.ReadToEnd();
        File.WriteAllText("services.xml", result)

我的问题是我总是得到 401 未授权。 有趣的是,如果我对同一台服务器使用相同的授权 header 但我使用 AXL 代码(例如 运行 SQL 查询),它可以正常工作,没有错误,但无法访问此页面通过 AXL..

为了测试页面是否能够通过 headers 接受授权,我安装了 SOAPUI 和 运行 URL header 并且页面显示正确离开。

这看起来很简单,但显然我错了。欢迎任何帮助和指导。

评论太长了。

我认为您正在尝试通过 SOAP API 协议请求。如果是这样,您需要根据其要求重新配置您的请求。

您可以使用 SoapUI 轻松做到这一点。在您的 SoapUI 上,创建一个新的请求模板,它将生成带有 body 和 headers 的简单请求。复制body(通常会是xml)连同请求Headers,你也可以使用请求日志功能来调试它。

由此,您将拥有一个非常好的开始配置,您可以在您的代码中使用它来设置请求。

您还需要确保您的 HTTP 协议,例如它是否需要 HTTP 或 HTTPS,它是版本 1 还是版本 1.1.. 等等。因为 HTTP 协议有时与 API 不同,并且没有您的请求将被拒绝的正确协议。

你可以这样做:

string username = "user";
string password = "password";

var request = (HttpWebRequest)WebRequest.Create("http://serverIP/ast/ASTIsapi.dll?GetPreCannedInfo&Items=getServiceInfoRequest");
request.ContentType = "text/xml; charset=utf-8";
request.Accept = "text/xml";
request.Method = "POST";
request.Headers.Add("SOAPAction", "yourSoapAction"); // you can get it from SoapUI if you don't know it.
request.Headers.Add("Authorization", "Basic " + System.Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)));
// OR you can use NetworkCredential 
// request.Credentials = new NetworkCredential("user", "password");

// Simpler method to bypass the certificate validation errors
ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

// Use this to set the HTTP Protocol Version
request.ProtocolVersion = HttpVersion.Version10;

/*
 * Empty Standard Soap Envelope
 */
XNamespace soapenv = @"http://schemas.xmlsoap.org/soap/envelope";

XDocument body = new XDocument(
    new XElement(soapenv + "Envelope",
        new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
        new XElement(soapenv + "Header"),
        new XElement(soapenv + "Body")
     ));

// Since it's POST, it's required to have body, if SoapUI generated an empty body, then create empty XDocument and pass it. 
using (var sw = new StreamWriter(request.GetRequestStream(), Encoding.UTF8))
    using (var httpresponse = (HttpWebResponse)request.GetResponse())
        using (var reader = new StreamReader(httpresponse.GetResponseStream()))
        {
            sw.Write(body);
            File.WriteAllText("services.xml", reader.ReadToEnd().ToString());
        }

对于 body,您需要修改 body 以满足 Cisco Call Manager 的要求。