具有基本身份验证的Webclient/HttpWebRequest返回404找不到有效URL

Jos*_*ade 54 .net c#

编辑:我想回过头来注意问题根本不是我的问题,而是另一个公司的代码.

我正在尝试使用基本身份验证来启动页面.我一直收到404 Page not found错误.我可以将我的网址复制并粘贴到浏览器中并且工作正常(如果我没有登录到他们的网站,它会弹出一个凭据框,否则它会打开我想要打开的内容).我必须到正确的地方并进行身份验证,因为如果我一方面输入了错误的用户名/密码,我得到一个401(未经过身份验证的错误),如果我在查询字符串中传递了一个错误的参数,我会收到内部服务器错误500 .我尝试使用Webclient和HttpWebRequest都导致相同的404未找到错误.

使用Webclient:

string url = "MyValidURLwithQueryString";
WebClient client = new WebClient();
String userName = "myusername";
String passWord = "mypassword";
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + passWord));
client.Headers[HttpRequestHeader.Authorization] = "Basic " + credentials;
var result = client.DownloadString(url);
Response.Write(result);
Run Code Online (Sandbox Code Playgroud)

使用HttpWebRequest

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("MyValidURL");
string authInfo = "username:password";
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers.Add("Authorization", "Basic " + authInfo);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Http.Get;
request.AllowAutoRedirect = true;
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader streamreader = new StreamReader(stream);
string s = streamreader.ReadToEnd();
Response.Write(s);
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 88

//BEWARE
//This works ONLY if the server returns 401 first
//The client DOES NOT send credentials on first request
//ONLY after a 401
client.Credentials = new NetworkCredential(userName, passWord); //doesnt work

//So use THIS instead to send credentials RIGHT AWAY
string credentials = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(userName + ":" + password));
client.Headers[HttpRequestHeader.Authorization] = string.Format(
    "Basic {0}", credentials);
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用`Encoding.UTF8.GetBytes()`或者它对像é这样的特殊字符不起作用 (3认同)
  • 哇!关于@Blake 描述的方法的重要说明在第二次请求之前不起作用。为解决方案点赞 (2认同)
  • 我一直在为一个类似的问题而苦苦挣扎,这完全解决了它。谢谢你! (2认同)

Bla*_*ake 25

尝试将Web客户端请求身份验证部分更改为:

NetworkCredential myCreds = new NetworkCredential(userName, passWord);
client.Credentials = myCreds;
Run Code Online (Sandbox Code Playgroud)

然后打电话,似乎对我来说很好.

  • 我也尝试设置凭据属性,它也出现了同样的问题。 (2认同)

the*_*zar 11

这部分代码对我来说很好:

        WebRequest request = WebRequest.Create(url);
        request.Method = WebRequestMethods.Http.Get;
        NetworkCredential networkCredential = new NetworkCredential(logon, password); // logon in format "domain\username"
        CredentialCache myCredentialCache = new CredentialCache {{new Uri(url), "Basic", networkCredential}};
        request.PreAuthenticate = true;
        request.Credentials = myCredentialCache;
        using (WebResponse response = request.GetResponse())
        {
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);

            using (Stream dataStream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(dataStream))
                {
                    string responseFromServer = reader.ReadToEnd();
                    Console.WriteLine(responseFromServer);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)