c# - 根据客户端不提供aspNetHidden div

标签 c# html asp.net dotnet-httpclient

我正在开发一个 C# 应用程序,它可以获取网页并逐行处理它们的内容。为此,我使用 HttpClient class,通过ReadAsStreamAsync()阅读页面内容.然后我将流读入一个线数组并对其进行迭代。到现在为止还挺好。

但是,如果我使用 Chrome 或 Edge 导航到网页并使用“查看源”获取 HTML,我使用此方法获得的 HTML 与我观察到的 HTML 不同。特别是 __VIEWSTATE 和 __VIEWSTATEGENERATOR 隐藏 input元素被 div 包围带有 class="aspNetHidden" 的元素当我使用浏览器时,而不是当我以编程方式获取 HTML 时。这破坏了我的行跟踪逻辑,因为浏览器看到的页面中有额外的行,与我在代码中获取的页面相关。

编辑 .经过一些测试,我确信客户端使用的用户代理 header 决定了 class="aspNetHidden" 是否存在。 div送达。当我模仿浏览器的用户代理(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37”)时,|671045|67104被送达;如果我使用其他代理,例如“测试客户端”,则 div未送达。

我的问题是,是否有任何关于用户代理字符串导致 div 的文档?被送达,哪些不送达?另外,我可以防止这种情况发生吗?

谢谢。

最佳答案

简而言之,它不是在用户代理方面记录/指定的,而是浏览器功能。

基于浏览器用户代理设置了一组功能。
这些功能在 .browser 中配置网络服务器上的配置文件。
例如.NET 4您可以在 %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\config\browsers 中找到这些文件,
例如chrome.browser , iphone.browser , 等等。

这样的.browser文件包含 tagwriter能力。
例如。 chrome.browser :

<browsers>
    <!-- Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.168.0 Safari/530.1 -->
    <browser id="Chrome" parentID="WebKit">
        <identification>
            <userAgent match="Chrome/(?'version'(?'major'\d+)(\.(?'minor'\d+)?)\w*)" />
        </identification>

        <capabilities>
          <capability name="browser"   value="Chrome" />
          <capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" />

          <!-- ... -->  
        </capabilities>
    </browser>
</browsers> 
tagwriter能力指定是否 System.Web.UI.HtmlTextWriterSystem.Web.UI.Html32TextWriter将被实例化以写入输出。
Default.browser中的默认配置文件,声明 tagwriter作为:
<capability name="tagwriter" value="System.Web.UI.Html32TextWriter" />

另外,如果 tagwriter功能缺少 Html32TextWriter正在使用。
来自 Microsoft reference source :
internal HtmlTextWriter CreateHtmlTextWriterInternal(TextWriter tw) {
    Type tagWriter = TagWriter;
    if (tagWriter != null) {
        return Page.CreateHtmlTextWriterFromType(tw, tagWriter);
    }

    // Fall back to Html 3.2
    return new Html32TextWriter(tw);
}
Html32TextWriter声明不渲染 div围绕隐藏的输入字段。
来自 Microsoft reference source :
internal override bool RenderDivAroundHiddenInputs {
    get {
        return false;
    }
}
HtmlTextWriter确实返回 trueRenderDivAroundHiddenInputs ,
Microsoft reference source .

关于这一切的更多阅读here .

你可以做什么。

如果您总是想要包装div , 使用众所周知的用户代理之一,否则使用自定义的,如 Test Client你已经在使用了。
如果您控制被请求的网站,您可以设置自定义.browser为您的自定义用户代理文件...但我宁愿不那样做...

发出请求时,只需设置适当的 User-Agent您的 HttpClient 上的请求 header ,例如:
var client = new HttpClient();
var userAgent = "Test Client"; // Or "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37"
client.DefaultRequestHeaders.Add("User-Agent", userAgent);

关于c# - 根据客户端不提供aspNetHidden div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62025626/

相关文章:

c# - 如何将不同数据类型的项目添加到列表中

javascript - 文档写入是将 html 写入第三方网站以实现企业品牌的首选方式吗?

javascript - 使用 Electron 时出错 `app.getPath(' home');`

asp.net - 在.NET中管理多个服务引用的最佳方法

asp.net - 我可以将 Entity Framework 与 ASP.NET 成员资格一起使用吗?

c# - 从 C# 中的标准 I/O 非阻塞读取

c# - 在 C# 中修剪数组中的所有字符串

c# - 错误 : Unable to evaluate expression because the code is optimized

c# - 删除 rowDataBound 事件中的 Gridview 行 asp.net c#

html - 无法在 :hover of another <li> 上显示 <ul>