UWP 拦截 Webview POST 请求并获取内容

Posted

技术标签:

【中文标题】UWP 拦截 Webview POST 请求并获取内容【英文标题】:UWP intercept Webview POST request and get the content 【发布时间】:2021-03-03 13:15:33 【问题描述】:

使用 UWP/XAML,我试图通过处理 WebResourceRequested 来拦截 WebView 的 POST(表单和文件上传)请求并获取要保存的内容,但是 Content keep 在本地窗口中显示“”并且不能被访问。我如何才能访问内容?

private void WebView_WebResourceRequested(WebView sender, WebViewWebResourceRequestedEventArgs args)

    if (request.Method.Method == "POST")
    
        HttpStreamContent content = (HttpStreamContent) args.request.Content;
        var contentBuffer = content.ReadAsBufferAsync().GetResults();
        byte[] buffer = contentBuffer.ToArray();
                        

非常感谢。

【问题讨论】:

您是否尝试将帖子 uri 添加到 content uris。 我试图获取包含表单提交和上传文件内容的 html POST 请求的实际正文。它应该在带有要访问的流对象的 Content 属性中,但值始终为“”。 【参考方案1】:

UWP拦截Webview POST请求并获取内容

这是 WebView1 中的已知问题。 目前,我们提供了一种解决方法,使用ReadAsInputStreamAsync 获取请求内容并使用固定长度加载缓冲区。因为它是非搜索流。我对我们拥有的简单复制样本进行了成功测试。

 private async void MyWebView_WebResourceRequested(WebView sender, WebViewWebResourceRequestedEventArgs args)
    

        if (args.Request.Method.Method == "POST")
        

            if (args.Request.Content != null)
            
                var bodyStream = await args.Request.Content.ReadAsInputStreamAsync();
                var buffer = new Windows.Storage.Streams.Buffer(4096);
                await bodyStream.ReadAsync(buffer, 4096, Windows.Storage.Streams.InputStreamOptions.None);
                var reader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);
                var len = reader.UnconsumedBufferLength;
                var body = reader.ReadString(len);

                Debug.WriteLine($"Body from POST request: body");

                        
        
    

当然,只要我们为发布数据提供足够大的缓冲区,这段代码就可以工作。对于此示例,这里 4096 字节的缓冲区足以获取发布的整个数据。

【讨论】:

所以它可以作为输入流使用。我虽然它已经在缓冲区中发送了所有内容。谢谢。我很高兴它仍然受到管理,因此我不必等待 WebView2。 但它无法读取上传文件的内容。我想知道是否有任何解决方法。或者它首先没有被 HttpRequestMessage 覆盖。 @yosimadsu,是的,我知道,恐怕解决方法不能那样工作。您需要在调用 ReadAsync 之前正确调整缓冲区大小。 我已经尝试了很多方法来读取 http POST 多部分,但似乎这是 WebView 控件的限制。可能我确实需要等待 WebView2 并尝试同样的事情,或者我必须制作自己的 webview。谢谢。

以上是关于UWP 拦截 Webview POST 请求并获取内容的主要内容,如果未能解决你的问题,请参考以下文章

webview怎么获取拦截页面中的Post数据?

Flutter webview 拦截所有请求并添加 headers

一手遮天 Android

spring boot拦截器中获取request post请求中的参数

spring boot拦截器中获取request post请求中的参数

Xamarin.Forms (UWP) - 如何获取 WebView 的 DOM 作为 HTML 字符串?