XmlReader.Create() 远程服务器返回错误:(403)禁止访问。

5
_rssSource = @"http://feeds.bbci.co.uk/news/world/rss.xml";
XmlReader reader = XmlReader.Create(_rssSource);

我有如下代码,其中在GetResponse()处抛出以下错误:
System.Net.WebException was unhandled by user code
  Message=The remote server returned an error: (403) Forbidden.
  Source=System
  StackTrace:
       at System.Net.HttpWebRequest.GetResponse()
       at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
   at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
   at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
   at System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext)
   at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext)
   at System.Xml.XmlReader.Create(String inputUri)

我已经尝试通过Fiddler跟踪请求,但除了包含代码的页面请求外,没有其他请求显示出来。该链接可以在IE / Visual Studio中正常工作。
我不确定是否与代理服务器/IIS/网络设置有关。您知道发生了什么吗?

您的代码示例甚至没有展示 GetResponse()。如果相关代码不在那里,很难看出问题出在哪里。 - David
你认为 XmlReader.Create 会引发403错误吗?实际上,网络返回了真正的403错误,但由于某种原因你无法看到它。试着用普通的 WebRequestWebClient 获取内容,只是作为一个实验。 - John Saunders
1
GetResponse() 函数在 XmlReader.Create() 中被调用,正如您从堆栈跟踪中所看到的那样。这个问题在我家里也没有出现,所以我认为这一定是某种设置问题。 - JBB
如果在家里可以工作,但在工作中不行,那么你的公司网络上是否有一个Web过滤器,禁止访问该源?我们在我们的网络上设置了一个过滤器,以过滤除允许站点之外的任何内容,如果我们尝试访问未经允许的内容,则会从我们的过滤器中得到403禁止。请尝试通过Internet Explorer(或所选浏览器)访问该源 - 使用与您自己代码不同的东西,以便您可以查看该机器是否可以访问该源... - 这与@John Saunders建议的非常相似。 - David
是的,正如我所说的,在ie/vs2010中它可以正常工作。根据Fiddler的显示,除非有一些Fiddler没有监控到的情况,否则我的计算机不会发送任何请求被拒绝。例如,IIS/.NET是否使用与Internet Explorer不同的代理设置等。 - JBB
显示剩余3条评论
1个回答

14
尝试使用在同一台机器上运行的浏览器访问相同的源,以消除易于检测的问题,例如所需凭据或网络限制。如果您的浏览器可以正常读取该源,则可能需要调整请求属性。
XmlReader.Create() 提供的默认 .NET 用户代理可能会被 RSS 服务明确禁止。测试其是否存在的简单方法是在 WebClient 对象中显式设置用户代理字符串,然后调用 URL 上的 OpenRead() 方法。
WebClient webClient = new WebClient();
webClient.Headers.Add("user-agent", "MyRSSReader/1.0");

XmlReader reader = XmlReader.Create(webClient.OpenRead(_rssSource));

如果您发明的用户代理字符串无法使用,可以尝试伪装成知名 Feed Reader 或浏览器的字符串。

那个由XmlReader.Create()提供的默认.NET用户代理很有意思。从来没有想过不去设置它。太棒了!你得到了我的支持! - Ken
默认的.NET用户代理由XmlReader.Create()提供,这真是有趣。从来没有想过没有设置它。太棒了!你得到了我的支持! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接