【问题标题】:Xml response file: Received in browser, not via C#Xml 响应文件:在浏览器中接收,而不是通过 C#
【发布时间】:2012-01-23 17:18:10
【问题描述】:

我正在尝试通过 C# 访问 last.fm API。作为第一个测试,如果这很重要,我会询问类似的艺术家。

当我传递正确的艺术家姓名(即“Nirvana”)时,我会收到一个 XML 响应。我的问题是当我提供无效名称(即“Nirvana23”)时,我没有收到 XML,而是收到错误代码(403 或 400)和 WebException

有趣的事情:如果我在浏览器中输入 URL(用 Firefox 和 Chrome 测试)我会收到我想要的 XML 文件(包含 lastfm 特定的错误消息)。

XmlReaderXDocument 我都试过了:

XDocument doc = XDocument.Load(requestUrl);

HttpWebRequest:

string httpResponse = "";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);

HttpWebResponse response = null;
StreamReader reader = null;

try
{
     response = (HttpWebResponse)request.GetResponse();
     reader = new StreamReader(response.GetResponseStream());
     httpResponse = reader.ReadToEnd();
}    

URL 类似于“http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=Nirvana23”(以及 lastfm 给出的特定键,但即使没有它 - 它应该返回 XML)。一个尝试的链接:link(这是我无法通过 C# 访问的错误文件)。

我也尝试过(没有成功):在 WireShark 的帮助下比较浏览器和我的程序的请求。然后我在请求中添加了一些标头,但这也没有帮助。

【问题讨论】:

  • 我没有使用过 WireShark,但你可能会更好地使用 HTTP 调试器,例如 Fiddler

标签: c# .net xml webexception


【解决方案1】:

在 .NET 中,WebRequest 将 HTTP 错误代码转换为异常,而您的浏览器只是忽略它们,因为响应不是空的。如果您捕获到异常,则 GetResponseStream 方法仍应返回您所期望的错误 XML。

编辑:

试试这个:

string httpResponse = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);

WebResponse response = null;
StreamReader reader = null;
try
{
    response = request.GetResponse();
}
catch (WebException ex)
{
    response = ex.Response;
}

reader = new StreamReader(response.GetResponseStream());
httpResponse = reader.ReadToEnd();

【讨论】:

  • 问题是request.GetResponse()方法抛出了异常。所以流不是真正可读的。无论如何,我试图将 StreamReader 行放在一个 catch 块中,但我只是得到不可读的东西。 `catch (WebException e) { response = (HttpWebResponse)e.Response; reader = new StreamReader(response.GetResponseStream()); httpResponse = reader.ReadToEnd(); }`
  • 添加了一个例子。您可能希望查看 WebException 中的错误代码,并相应地处理响应,而不是盲目地从异常返回响应。
  • 我试过了,但不幸的是,StreamReader 无法读取有用的内容。只有无用的转义字符和特殊字符。我想 WebException 不能提供我想要的东西 - 如果我在浏览器中打开以下链接 link,我会得到一个像这样的 XML 文件。
  • 我不知道为什么,但我今天又试了一次,它成功了! (也许 lastfm 在服务器端改变了一些东西,或者我昨天一遍又一遍地犯了同样的错误。)无论如何,现在它可以工作了。谢谢!小注:try 和 catch 块中的响应必须转换为 HttWebResponse。
【解决方案2】:

你为什么不捕捉异常然后相应地处理它。如果您想显示任何自定义错误,您也可以在您的 catch 块中执行此操作。

【讨论】:

  • 这样,我不知道究竟是什么造成了问题。 Lastfm 提供一个 XML 文件,其中包含有关错误的特定信息(例如,错误的身份验证密钥或未知艺术家)。这个文件是我喜欢评估的。
  • 您是否检查了无效艺术家和错误身份验证的状态代码是什么?如果我们发现它们不同,则捕获该错误,然后根据状态代码,我们可以确定出了什么问题。
  • 也许我没有明确指出这一点,但我想要获得(以及我在浏览器中获得的)是一个包含有关错误信息的 XML 文件。在浏览器中打开 link 会提供我想要的这个 XML 文件。所以这不是 HTTP 错误代码。
猜你喜欢
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多