WinRT 8.1 Web 视图内容类型

WinRT 8.1 WebView Content Type

我正在尝试使用 Windows Phone 8.1 中的 HttpRequestMessage 加载 webview。问题是在 Fiddler 中检查时 Content-Type header 在内容 header 中丢失。

            byte[] postData = GetWebviewPostDataBytes();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, prepareUri(url));
            var httpContent = new HttpBufferContent(postData.AsBuffer());
            httpContent.Headers.Add("Content-Type", GetContentType());
            request.Headers.Add("User-Agent", GetUserAgent());
            request.Content = httpContent;
            webView.NavigateWithHttpRequestMessage(request);

我发现了一些链接,其中这是一个内部错误。有人可以告诉我解决方法吗?

我为此找到的唯一解决方案是使用表单加载您的页面。

我正在加载使用 POST 参数生成的本地 HTML 页面。此页面包含一个隐藏的 HTML 表单,我将在页面加载后提交该表单。

此时网页加载为:

  1. 生成一个本地 HTML 页面,其中包含表单和隐藏输入字段中的参数
  2. 在您的网络视图中加载此页面
  3. 加载页面后,使用网页 postContent() 函数请求提交表单
  4. 然后,webview 将导航到具有 content-type header 集
  5. 的预期网页

此示例代码是在 WinJS 中,但它可以很容易地在 C# 中转换,因为它是相同的 webview 组件。

var htmlContent     = "<html><head><script type='text/javascript'>function postContent(){document.getElementById('postForm').submit();}</script></head><body><form id='postForm' action='{targetUrl}' method='post'>{inputFields}</form></body></html>";
var inputFields     = "";
var iterator        = payloadContent.first();
while(iterator.hasCurrent)
{
    inputFields     += "<input hidden='on' name='{n}' value='{v}'/>".replace("{n}", iterator.current.key).replace("{v}", iterator.current.value);
    iterator.moveNext();
}
var htmlContent     = htmlContent.replace("{targetUrl}", "YOUR URL HERE").replace("{inputFields}", inputFields);
this._webviewElement.navigateToString(htmlContent);

在页面加载事件中,您将必须请求 webview 执行 'postContent()' javascript 函数以提交表单。

this._webviewElement.invokeScriptAsync("postContent");

希望对您有所帮助。