Warm tip: This article is reproduced from serverfault.com, please click

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

(c# - UWP intercept Webview POST request and get the content)

发布于 2020-11-20 05:06:56

使用UWP / XAML,我想通过处理WebResourceRequested来拦截WebView的POST(表单和文件上传)请求,并获取要保存的内容,但是内容保持在本地窗口中显示为“ <未缓冲>”,并且无法访问。如何获得内容?

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();
    }                    
}

非常感谢你。

Questioner
yosi madsu
Viewed
11
Nico Zhu - MSFT 2020-12-02 19:33:47

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

这是WebView1中的已知问题。当前,我们提供了一种变通方法,可ReadAsInputStreamAsync用于获取请求内容并使用固定长度来加载缓冲区。因为它是不速流。我对我们拥有的简单repro样本进行了成功测试。

 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个字节的缓冲区足以获取整个数据。