1

目前我正在 C# 环境中使用 Awsomnium 1.7。我只是在使用 Core 并尝试定义自定义帖子参数。现在,我用谷歌搜索了很多,我什至在 asomnium 论坛上发帖,但没有答案。我理解这个概念,但最近的更改只是删除了建议的机制和示例。

我发现了什么:http: //support.awesomium.com/kb/general-use/how-do-i-send-form-values-post-data

问题在于,WebView 类不再包含“OnResourceRequest”事件。到目前为止,我已经实现了 IResourceInterceptor 并且“OnRequest”-Function 覆盖了 public ResourceResponse OnRequest(ResourceRequest request) 是签名,但我没有机会到达那里以添加请求标头。这里有人知道吗?我试图查看文档,但我没有找到任何内容......

4

2 回答 2

5

您需要将 IResourceInterceptor 附加到 WebCore,而不是 WebView。这是一个工作示例:

资源拦截器:

public class CustomResourceInterceptor : ResourceInterceptor
{
    protected override ResourceResponse OnRequest(ResourceRequest request)
    {
        request.Method = "POST";
        var bytes = "Appending some text to the request";
        request.AppendUploadBytes(bytes, (uint) bytes.Length);
        request.AppendExtraHeader("custom-header", "this is a custom header");

        return null;
    }
}

主要应用:

public MainWindow()
{
    WebCore.Started += WebCoreOnStarted;
    InitializeComponent();
}

private void WebCoreOnStarted(object sender, CoreStartEventArgs coreStartEventArgs)
{
    var interceptor = new CustomResourceInterceptor();

    WebCore.ResourceInterceptor = interceptor;
    //webView is a WebControl on my UI, but you should be able to create your own WebView off WebCore
    webView.Source = new Uri("http://www.google.com");
}
于 2012-11-21T16:06:18.080 回答
4

HotN 上面的回答很好;事实上,这是我的回答所依据的。然而,我花了一周的时间搜索这些信息并整理出一些可行的东西。(上面的答案有几个问题,至少在 Awesomium 的 v1.7 中无法使用。)我正在寻找的是可以直接使用的东西。

这就是解决方案。它需要改进,但它适合我目前的需求。我希望这对其他人有帮助。

// CRI.CustomResourceInterceptor
//
// Author:   Garison E Piatt
// Contact:  {removed}
// Created:  11/17/14
// Version:  1.0.0
//
// Apparently, when Awesomium was first created, the programmers did not understand that someone would
// eventually want to post data from the application. So they made it incredibly difficult to upload
// POST parameters to the remote web site. We have to jump through hoops to get that done.
//
// This module provides that hoop-jumping in a simple-to-understand fashion. We hope. It overrides
// the current resource interceptor (if any), replacing both the OnRequest and OnFilterNavigation
// methods (we aren't using the latter yet).
//
// It also provides settable parameters. Once this module is attached to the WebCore, it is *always*
// attached; therefore, we can simply change the parameters before posting to the web site.
//
// File uploads are currently unhandled, and, once handled, will probably only upload one file. We
// will deal with that issue later.
//
// To incoroprate this into your application, follow these steps:
// 1. Add this file to your project. You know how to do that.
// 2. Edit your MainWindow.cs file.
//   a. At the top, add:
//       using CRI;
//   b. inside the main class declaration, near the top, add:
//       private CustomResourceInterceptor cri;
//   c. In the MainWindow method, add:
//       WebCore.Started += OnWebCoreOnStarted;
//       cri = new CustomResourceInterceptor();
//     and (set *before* you set the Source value for the Web Control):
//       cri.Enabled = true;
//       cri.Parameters = String.Format("login={0}&password={1}", login, pw);
//     (Choose your own parameters, but format them like a GET query.)
//   d. Add the following method:
//       private void OnWebCoreOnStarted(object sender, CoreStartEventArgs coreStartEventArgs) {
//         WebCore.ResourceInterceptor = cri;
//       }
// 3. Compile your application. It should work.

using System;
using System.Runtime.InteropServices;
using System.Text;
using Awesomium.Core;
using Awesomium.Windows.Controls;


namespace CRI {
  //* CustomResourceInterceptor
  // This object replaces the standard Resource Interceptor (if any; we still don't know) with something
  // that allows posting data to the remote web site. It overrides both the OnRequest and OnFilterNavigation
  // methods. Public variables allow for run-time configuration.
  public class CustomResourceInterceptor : IResourceInterceptor {
    // Since the default interceptor remains overridden for the remainder of the session, we need to disable
    // the methods herein unless we are actually using them. Note that both methods are disabled by default.
    public bool RequestEnabled = false;
    public bool FilterEnabled = false;

    // These are the parameters we send to the remote site. They are empty by default; another safeguard
    // against sending POST data unnecessarily. Currently, both values allow for only one string. POST
    // variables can be combined (by the caller) into one string, but this limits us to only one file
    // upload at a time. Someday, we will have to fix that. And make it backward-compatible.
    public String Parameters = null;
    public String FilePath = null;

    /** OnRequest
    ** This ovverrides the default OnRequest method of the standard resource interceptor. It receives
    ** the resource request object as a parameter.
    **
    ** It first checks whether or not it is enabled, and returns NULL if not. Next it sees if any
    ** parameters are defined. If so, it converst them to a byte stream and appends them to the request.
    ** Currently, files are not handled, but we hope to add that someday.
    */
    public ResourceResponse OnRequest(ResourceRequest request) {
      // We do nothing at all if we aren't enabled. This is a stopgap that prevents us from sending
      // POST data with every request.
      if (RequestEnabled == false) return null;

      // If the Parameters are defined, convert them to a byte stream and append them to the request.
      if (Parameters != null) {
        var str = Encoding.Default.GetBytes(Parameters);
        var bytes = Encoding.UTF8.GetString(str);

        request.AppendUploadBytes(bytes, (uint)bytes.Length);
      }

      // If either the parameters or file path are defined, this is a POST request. Someday, we'll
      // figure out how to get Awesomium to understand Multipart Form data.
      if (Parameters != null || FilePath != null) {
        request.Method = "POST";
        request.AppendExtraHeader("Content-Type", "application/x-www-form-urlencoded"); //"multipart/form-data");
      }

      // Once the data has been appended to the page request, we need to disable this process. Otherwise,
      // it will keep adding the data to every request, including those that come from the web site.
      RequestEnabled = false;
      Parameters = null;
      FilePath = null;

      return null;
    }


    /** OnFilterNavigation
    ** Not currently used, but needed to keep VisualStudio happy.
    */
    public bool OnFilterNavigation(NavigationRequest request) {
      return false;
    }
  }
}
于 2014-11-17T13:41:52.480 回答