- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无论出于何种原因,IBM 对其 RSS 提要使用 https(无需凭据)。我正在尝试消费 https://www.ibm.com/developerworks/mydeveloperworks/blogs/roller-ui/rendering/feed/gradybooch/entries/rss?lang=en使用 .NET 4 SyndicationFeed。我可以在浏览器中打开这个提要,它加载得很好。这是代码:
using (XmlReader xml = XmlReader.Create("https://www.ibm.com/developerworks/mydeveloperworks/blogs/roller-ui/rendering/feed/gradybooch/entries/rss?lang=en"))
{
var items = from item in SyndicationFeed.Load(xml).Items
select item;
}
异常(exception)情况:
System.Net.WebException was unhandled by user code
Message=The remote server returned an error: (500) Internal Server Error.
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)
at EDN.Util.Test.FeedAggTest.LoadFeedInfoTest() in D:\cdn\trunk\CDN\Dev\Shared\net\EDN.Util\EDN.Util.Test\FeedAggTest.cs:line 126
如何配置阅读器以使用 https 提要?
最佳答案
我认为这与安全无关。 500 错误是服务器端错误。 XmlReader.Create(url) 生成的请求中的某些内容混淆了 ibm 网站。如果这只是一个安全问题,正如您在问题中所建议的那样,那么您会收到 403 错误或“授权被拒绝”。但是你得到了 500,这是一个应用程序错误。
即便如此,也许客户端应用程序可以做一些事情,以避免混淆服务器。
我查看了传出的 HTTP 请求 header ,使用 Fiddler .对于 IE 生成的请求, header 如下所示:
GET https://www.ibm.com/developerworks/mydeveloperworks/blogs/roller-ui/rendering/feed/gradybooch/entries/rss?lang=en HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, application/x-silverlight-2-b2, */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; .NET CLR 3.5.30729;)
Accept-Encoding: gzip, deflate
Host: www.ibm.com
Connection: Keep-Alive
Cookie: UnicaNIODID=Ww06gyvyPpZ-WPl6K7y; conxnsCookie=en; IBMPOLLCOOKIE=""; UnicaNIODID=QridYHCNf7M-WYM8Usr
对于来自 XmlReader.Create(url) 的请求, header 如下所示:
GET https://www.ibm.com/developerworks/mydeveloperworks/blogs/roller-ui/rendering/feed/gradybooch/entries/rss?lang=en HTTP/1.1
Host: www.ibm.com
Connection: Keep-Alive
差别很大。另外,在对后者的回应中,我得到了一个 Set-Cookie
header ,在 500 响应中,在对 IE 的响应中不存在。
基于此,我推测是请求 header (尤其是 cookie)的差异让 ibm.com 感到困惑。
我不知道如何说服 XmlReader.Create() 嵌入我想要的所有请求 header ,包括 cookie。但我知道如何使用 HttpWebRequest 来做到这一点。所以我用了那个。
我必须清除一些障碍。
我需要 ibm.com 的持久性 cookie。为此,我不得不求助于 Win32 的 p/invoke InternetGetCookie .请参阅 WebRequest 文档页面底部用户提供的内容中附加的 PersistentCookies 类。 ,如何做到这一点。附加 cookie 后,我不再收到 500 错误。万岁!
但是 XmlReader.Create() 无法读取生成的流。对我来说它看起来是二进制的。我意识到我需要解压缩 gzip 或压缩的内容。为此,我必须
在接收到的响应流周围包装一个 GZipStream 或 DeflateStream,并使用 XmlReader 的解压缩流。
设置 AutomaticDecompression HttpWebRequest 上的属性。我本可以通过不在 Accept-Encoding
上包含“gzip, deflate”来避免这种需要出站请求中的 header 。实际上,在设置 AutomaticDecompression 属性后,这些 header 会在出站 HTTP 请求中隐式设置。
当我这样做时,我得到了实际的文本。但是一些字节码被关闭了。接下来,我需要在 TextReader 中使用正确的文本编码,如 HttpWebResponse 中所示。
这样做之后,我得到了一个合理的字符串,但是生成的解压缩 rss 流导致 XmlReader 阻塞,
ReadElementString method can only be called on elements with simple or empty content. Line 11, position 25.
我看了看,发现了一个小的 <script>
block ,在那个位置,在 <copyright>
内rss 文档中的元素。似乎 IBM 正试图通过附加将在浏览器中运行的逻辑来格式化日期来让浏览器“本地化”版权日期。对我来说似乎有点矫枉过正,甚至是 IBM 的错误。但是因为元素的文本节点中的尖括号困扰了 XmlReader,所以我用 Regex 替换删除了脚本 block 。
清除这些障碍后,它奏效了。 .NET 应用程序能够从该 https url 读取 RSS 流。
我没有做任何进一步的测试 - 看看是否改变 Accept
header 或 Accept-Encoding
header 会改变行为。如果你关心的话,那是你要弄清楚的。
结果代码如下。它比你简单的 3 线更难看。我不知道如何让它更简单。
public void Run()
{
string url;
url = "https://www.ibm.com/developerworks/mydeveloperworks/blogs/roller-ui/rendering/feed/gradybooch/entries/rss?lang=en";
HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create(url);
// attach persistent cookies
hwr.CookieContainer =
PersistentCookies.GetCookieContainerForUrl(url);
hwr.Accept = "text/xml, */*";
hwr.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us");
hwr.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; .NET CLR 3.5.30729;)";
hwr.KeepAlive = true;
hwr.AutomaticDecompression = DecompressionMethods.Deflate |
DecompressionMethods.GZip;
using (var resp = (HttpWebResponse) hwr.GetResponse())
{
using(Stream s = resp.GetResponseStream())
{
string cs = String.IsNullOrEmpty(resp.CharacterSet) ? "UTF-8" : resp.CharacterSet;
Encoding e = Encoding.GetEncoding(cs);
using (StreamReader sr = new StreamReader(s, e))
{
var allXml = sr.ReadToEnd();
// remove any script blocks - they confuse XmlReader
allXml = Regex.Replace( allXml,
"(.*)<script type='text/javascript'>.+?</script>(.*)",
"$1$2",
RegexOptions.Singleline);
using (XmlReader xmlr = XmlReader.Create(new StringReader(allXml)))
{
var items = from item in SyndicationFeed.Load(xmlr).Items
select item;
}
}
}
}
}
关于c# - 如何在不提供凭据的情况下将安全的 rss 提要读入 SyndicationFeed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813989/
合并 feed 和 feed2 的简单方法是什么?我希望将 feed2 中的项目添加到 feed。此外,我想避免重复,因为当问题同时使用 WPF 和 Silverlight 标记时,feed 可能已经
这似乎是一个愚蠢的问题,但我终究无法弄清楚如何在 C# 中访问 SyndicationFeed 类。我在 MSDN 上看到的每个示例或以其他方式假定它已经导入,而我发现的没有一个示例给出了它所在位置的
如何生成包含下图中显示的命名空间的 Atom Feed? Atom 提要的所有节点都必须以“a:”开头。 这是我现在正在做的,但是它不起作用。 SyndicationFeed feed = n
我有一个这样的类(class): public static class MyFeedExtensions { private readonly static XNamespace _name
我正在使用 SyndicationFeed类来生成 Atom 提要和 Atom10FeedFormatter 来序列化它。当文件写入磁盘时,我希望能够在元素之间添加换行符。我知道 feed 读者不在乎
我正在尝试阅读一些 Rss/Atom 提要 var synFeed = SyndicationFeed.Load(reader); 但它会引发最轻微的问题。例如,当一个项目在描述字段中包含几个 HTM
我正在使用 SyndicationFeed 从不同的 RSS 源中检索一些数据。但是,我在尝试阅读 RSS 时遇到了一个问题,据我所知,RSS 与有效的 RSS 具有相同的元素和数据。 Syndica
我正在向 RSS Feed 添加一些自定义 iTunes 播客标签。 feed.AttributeExtensions.Add(new XmlQualifiedName(itunesP
我正在使用 SyndicationFeed 类来使用一些 rss 提要。我想知道如何获取 RSS 提要的 content:encoded 节点。这是我正在使用的代码: XmlReader reader
在我的提要生成代码中,我有以下内容: XNamespace itunesNS = "http://www.itunes.com/dtds/podcast-1.0.dtd"; feed.ElementE
我正在使用 .NET 的 SyndicationFeed 创建 RSS 和 ATOM 提要。不幸的是,我需要 description 元素(SyndicationItem 的 Content 属性)中
我们可以通过 async/await 读取 RSS 吗? XmlReader reader = XmlReader.Create("http://localhost/feeds/serializedF
无论出于何种原因,IBM 对其 RSS 提要使用 https(无需凭据)。我正在尝试消费 https://www.ibm.com/developerworks/mydeveloperworks/blo
我正在尝试使用 Xamarin 中的 SyndicateFeed 类将 RSS 提要数据拉入 iOS 应用程序。 我正在使用 system.ServiceModel - 但我找不到这个类。 Xamar
我在 asp.net core 中遇到 SyndicationFeed 问题。我知道它还没有移植到 asp.net 核心,但我也使用完整的 .net 框架,所以我认为它应该可以工作。 这是我的代码,但
我需要为学校项目申请 Windows Phone。我按照教程做了 RSS 阅读器,但它不起作用,我不知道为什么。 我遇到以下错误(运行后): System.Windows.Data Error: Bi
我正在使用 SyndicationFeed 类为文章使用一些 rss 提要。我想知道如何只从项目的摘要字段中获取文本,而不使用 html 标签。例如,有时(并非总是)它包含 html 标签,例如:di
我有一个联合供稿。使用 Rss20FeedFormatter 进行序列化时,我得到了在 xml 中声明的 xmlns:cf 和 xmlns:cfi 命名空间。媒体元素保持内联。 我确信这就是缩略图无
我创建了一个包含许多 SyndicationItem 的简单 SyndicationFeed。每个 SyndicationItem 都有 HtmlContent。 HtmlContent 是一个表。这
在 .net 3.5 中,有一个 SyndicationFeed 将加载 RSS 提要并允许您在其上运行 LINQ。 这是我正在加载的 RSS 示例: Title of RSS feed
我是一名优秀的程序员,十分优秀!