【问题标题】:The remote server returned an error远程服务器返回错误
【发布时间】:2012-02-24 16:49:12
【问题描述】:

我正在尝试读取这样的 JSON 数据流-

string Username = "username";
string Password = "password";

string BaseUrl = "url";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(BaseUrl);
request.Credentials = new NetworkCredential(Username, Password);
request.ContentType = "application/json; charset=utf-8";
request.Headers["Authorization"] = "Basic " + authInfo;

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    if (response.StatusCode != HttpStatusCode.OK) throw new Exception(string.Format("Server returned {0}\n {1}", response.StatusCode, response.ToString()));
    // Cheat and always expect utf-8
    string result = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8).ReadToEnd();

    richTextBox1.Text = result;

我不确定这是否是通过将用户名和密码作为字符串传递来获得身份验证的基本方法,但是执行一次我得到以下错误-

远程服务器返回错误:(406) Not Acceptable。

我怎样才能克服这个问题?

【问题讨论】:

  • 也许愚蠢的问题你有访问服务器的权限吗?
  • 您确定给定的登录名可以访问吗?
  • 请不要在标题中添加“C#”。这就是标签的用途。
  • 另外,如果此登录是AD登录,例如,您如何处理域?
  • 提供的凭据是获得服务器访问权限的登录详细信息,但这可能不是传递它们的正确方法?

标签: c# json httpwebresponse server-error


【解决方案1】:

尝试使用标头身份验证,而不是通过 NetworkCredentials 进行验证

public void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
{
  string authInfo = userName + ":" + userPassword;
  authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
  req.Headers["Authorization"] = "Basic " + authInfo;
}

【讨论】:

  • 对,我已经添加了该代码,它现在返回 - 远程服务器返回错误:(406)不可接受。
  • 把正确的接受你的流的内容类型。 req.Accept="音频/mpeg";例如
  • 对,我给它一个 bash,如果它有效,将标记为正确。
  • 它是一个我试图消费的 json 流?
  • 所以尝试 re.accept = "application/json" 当你说来自 json 调用的流时,我只是感到困惑,但没关系