【问题标题】:How to get data from a client on load?如何在加载时从客户端获取数据?
【发布时间】:2013-08-01 16:07:55
【问题描述】:

我知道数据可以通过 URL 传递,例如“example.com/thing?id=1234”,也可以通过表单和“提交”按钮传递,但这些都不是方法对我有用。

我需要一个相当大的 xml 字符串/文件。我需要解析它并从中获取数据,然后才能显示我的页面。

如何在页面加载时获得此信息?客户端是否必须发送http请求?还是将 xml 作为字符串提交到隐藏表单?


使用背景信息编辑:

我正在创建一个小部件,它将出现在我客户的应用程序中,使用 C# WebBrowser 控件嵌入,但将托管在我的服务器上。 Web 应用程序需要通过 xml 将一些数据(包括用于客户端验证的令牌)传递给我的小部件,这需要在我的小部件启动时首先加载。

【问题讨论】:

  • 您需要提供一种方法让他们为您提供 xml 文件。最常见的方法是创建一个只有上传文件输入的简单页面,然后只有在处理完文件后才会显示常规页面。
  • @Queti,我无法为此创建额外的页面或字段;这需要在加载时发生,因为我没有直接从用户那里获取 xml。它是由另一个正在调用我的页面的页面生成的,所有这些都发生在后台......
  • 那么是用户参与上传xml文件还是通过不涉及用户直接输入的某些过程完成?
  • 不涉及用户输入。
  • 我在关于我想要做什么的问题中添加了更多信息。

标签: c# xml asp.net-mvc-4 io webbrowser-control


【解决方案1】:

ASP.NET MVC 4 非常适用于 jQuery 和 aJax 帖子。我利用这一点已经多次实现了这个目标。

jQuery:

        $(document).ready(function() {            
            $.ajax({
                type: "POST",
                url: "/{controller}/{action}/",
                data: { clientToken: '{token}', foo: 'bar',
                success: function (data, text) {
                        //APPEND YOUR PAGE WITH YOUR PARSED XML DATA
                        //NOTE: 'data' WILL CONTAIN YOUR RETURNED RESULT
                }
            });
        });

MVC 控制器:

    [HttpPost]
    public JsonResult jqGetXML(string clientToken, string foo)
    {
        JsonResult jqResult = new JsonResult();

        //GET YOUR XML DATA AND DO YOUR WORK
        jqResult.Data = //WHATEVER YOU WANT TO RETURN;

        return jqResult;
    }

注意:此示例返回 Json 数据(更易于使用 IMO),而不是 XML。它还假设 XML 数据不是来自客户端,而是存储在服务器端。

编辑: 这是 jQuery 的 Ajax 文档的链接, http://api.jquery.com/jQuery.ajax/

【讨论】:

    【解决方案2】:

    假设您使用的是 ASP.NET,既然您说它是由另一个页面生成的,那么只需将 XML 粘贴在 Session 状态即可。

    【讨论】:

    • 是的,这工作,但如果它具有像 OP 这样的任何实际大小,则表明它对服务器端资源的使用非常糟糕,并且可能会危及性能和稳定性。跨度>
    【解决方案3】:

    另一种方法,不确定它是否对您的情况有帮助。

    如果您在两个站点上共享二级域名(即 .....sitename.com ),那么共享数据的另一种潜在方式是您可以让他们在二级域名上使用令牌和 xml 声明一个 cookie里面的数据。然后,您将获得此 cookie。

    我这样做只是为了共享身份验证详细信息,您至少需要共享机器密钥才能支持这一点(假设这里是 .Net...)。

    【讨论】:

      【解决方案4】:

      您将无法自动将文件从客户端上传到服务器 - 至少不能通过使用 html/js/httprequests 的浏览器。浏览器根本不允许这样做。

      想象一下,如果浏览器允许您在他们不知情的情况下从客户端本地计算机上静默上传文件,会带来哪些安全隐患。

      【讨论】:

        【解决方案5】:

        示例解决方案:

        后台进程导入xml文件并解析。后台进程知道它是给客户 YYY 的,并更新他们的信息,因此它知道 xml 文件已被处理。

        访问者访问嵌入了小部件的客户 Web 应用程序。在小部件的标记中添加了客户令牌。这可以在 JavaScript、Flash、iFrame 等中。

        当小部件加载时,它会向您的应用发出请求,然后该应用检查文件是否已针对提供的客户 (YYY) 进行了解析,如果有,然后显示页面/小部件。

        【讨论】:

          【解决方案6】:

          如果 XML 是通过 HTTP 提供的,您可以使用 Liqn 来解析数据。

          例如

           public partial class Sample : System.Web.UI.Page
          {
              protected void Page_Load(object sender, EventArgs e)
              {
                  string url = "http://news.yahoo.com/rss/";
                  var el = XElement.Load(url).Elements("channel");
          
                  StringBuilder output = new StringBuilder();
          
                  foreach (var c in el.Elements())
                  {
                      switch (c.Name.LocalName.ToLower())
                      {
                          case "title": 
                              output.Append(c.Value);
                              output.Append("<br />");
                              break;
                      }
                  }
          
                  this.Label1.Text = output.ToString();
          
              }
          }
          

          【讨论】:

            【解决方案7】:

            目前尚不清楚应用程序是什么,您有哪些选项,以及您对 Web 服务器有哪些控制。

            如果您是 Web 服务器/应用程序的所有者,您的选择范围会更广。您可以先使用 HTTP POST 或 PUT 将文件发送到 Web 服务器,包括随机令牌,然后在查询字符串中使用带有令牌的 GET 相同的令牌

            或使用其他选项,适用于第三方拥有的网站

            如果您尝试使用一些 auth api,请了解有关它的更多信息。由于您托管的是 Web 浏览器控件,因此您有很多选项可以编写脚本。包括加载任何表单,使用您的 xml 设置 textarea 或隐藏字段文本,然后模拟提交按钮单击。然后,您可以响应任何重定向和 html 响应。

            您还可以在页面中注入 javascript,然后通过 ajax 请求将其发送到服务器。

            选择很大程度上取决于交互模型。

            如果您需要更好的建议,如果您提供示例/简化的 url/url 模式、表单内容和从代码/api/sdk 角度预期的事件序列,那将是最有帮助的。他们通常很友好。

            【讨论】:

              【解决方案8】:

              在页面之间传递数据的方法数量有限。为此,我个人会在生成页面期间保持会话,并在所需页面中检索到它时将其清除。 如果它是在服务器端生成的,那么就没有理由从客户端检索它。

              http://msdn.microsoft.com/en-us/library/6c3yckfw(v=vs.100).aspx

              【讨论】:

                【解决方案9】:

                创建一个 Web 服务,您的 C# 应用程序可以将 XML 发布到并返回 HTML 作为响应。将此 HTML 字符串加载到 WebBrowser 控件中,而不是将控件指向 URL。

                【讨论】:

                  猜你喜欢
                  • 2019-04-08
                  • 1970-01-01
                  • 2013-10-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-25
                  相关资源
                  最近更新 更多