0

我有一个奇怪的问题,一个为我制作的函数在许多情况下都能完美运行,但是在一个地址(我不能说是为了保密)总是返回一个错误 401。在浏览器中,这个地址工作正常,但使用 HttpWebRequest不。有关更多信息,服务器使用 SSL 和 SAP 运行。接下来的功能是:

public static HttpWebResponse MakeRequest(string uri, string method, Dictionary<string, string> postData, CookieContainer cookies, ICredentials credentials, WebProxy proxy)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
    webRequest.CookieContainer = (cookies != null) ? cookies : new CookieContainer();
    webRequest.AllowAutoRedirect = true;
    webRequest.Credentials = (credentials != null) ? credentials : CredentialCache.DefaultCredentials;
    webRequest.Method = method.ToUpper();
    webRequest.Headers.Add("HTTP_USER_AGENT", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1134.0 Safari/537.1");
    webRequest.Headers.Add("HTTP_ACCEPT", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    webRequest.Headers.Add("HTTP_ACCEPT_ENCODING", "gzip,deflate");
    webRequest.Headers.Add("HTTP_ACCEPT_LANGUAGE", "es-ES,es;q=0.8");
    webRequest.Headers.Add("HTTP_ACCEPT_CHARSET", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");

    // allows for validation of SSL conversations
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
        ValidateRemoteCertificate
    );

    if (proxy != null)
    {
        webRequest.Proxy = proxy;
    }

    if (method.ToLower() == "post" && postData != null)
    {
        StringBuilder sb = new StringBuilder();

        foreach (string key in postData.Keys)
        {
            sb.AppendFormat("{0}={1}&", key, Text.UrlEncode(postData[key].ToString()));
        }

        if (sb.Length > 0)
        {
            string finalString = sb.ToString();
            Text.Chop(ref finalString);
            byte[] bytedata = Encoding.ASCII.GetBytes(finalString);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.ContentLength = bytedata.Length;
            Stream requestStream = webRequest.GetRequestStream();
            requestStream.Write(bytedata, 0, bytedata.Length);
            requestStream.Close();
        }
    }

    try
    {
        return (HttpWebResponse)webRequest.GetResponse();
    }
    finally
    {

    }
}

非常感谢。

4

1 回答 1

0

401 表示您遇到授权问题。鉴于您在请求中设置凭据,我猜这些是不正确的。例如,身份验证字段的值可能比您在代码中使用的值更容易接受。一种可以调试问题的方法是在浏览器中进行请求时检查请求标头中的内容(即,当它工作时)。您可以通过多种方式验证标头,即使用 Firefox 和 Firebug 插件来检查标头,或者您可以使用 wireshark。

于 2012-08-13T11:52:34.027 回答