使用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();
}
}
非常感谢你。
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个字节的缓冲区足以获取整个数据。
因此,它可用作输入流。我虽然已经在缓冲区中发送了所有内容。谢谢。我很高兴它仍然可以管理,因此不必等待WebView2。
但是它无法读取上传文件的内容。我想知道是否有任何解决方法。或首先不在HttpRequestMessage上覆盖它。
@yosimadsu,是的,我知道,我担心这种解决方法无法正常工作。您需要在调用ReadAsync之前正确调整缓冲区大小。
我已经尝试了许多方法来读取http POST内容,但似乎这是WebView控件的局限性。可能我确实需要等待WebView2并尝试相同的操作,否则我必须制作自己的Webview。谢谢。