【问题标题】:How do I call an asynchronous method from within an ASPX file (not codebehind)?如何从 ASPX 文件(不是代码隐藏)中调用异步方法?
【发布时间】:2020-08-27 19:15:00
【问题描述】:

我有一个 DLL,其中包含用于获取报告的异步方法。它完成了所有繁重的工作,包括 HTML 格式。

namespace MyReportEngine
{
    public class Renderer
    {
        static public async Task<string> GetReportHtml()
        {
            //Magic (not important)
        }
    }
}

我想创建一个网站而不做很多工作。我要做的就是创建一个使用 DLL 的简单 ASPX 文件。我试过这个:

<%@ Assembly Name="MyAssembly" %>
<%@ Import Namespace="MyAssembly.MyReportEngine" %>
<%@ Page Async="true" %>

<html>
<body>
    <% =await Renderer.GetReportHtml() %>
</body>
</html>

这会导致 JIT 编译期间出现运行时异常:

Compiler Error Message: BC36937: 'Await' can only be used when contained within a method or lambda expression marked with the 'Async' modifier.

我已经查看了 this one 之类的文档和教程,但它们似乎只处理向代码隐藏添加异步调用。没有关于如何从 ASPX 标记本身进行调用的信息。有可能吗?

【问题讨论】:

  • 您是否尝试启动页面然后动态加载内容?您可能需要对其中的内容进行 AJAX。
  • 不,我不想让页面启动然后动态加载内容。我正在尝试将页面完全呈现在服务器端。
  • 好的。比这是记录在案的东西:docs.microsoft.com/en-us/aspnet/web-forms/overview/…

标签: c# asp.net async-await webforms


【解决方案1】:

将其包装在单独的方法中,然后调用该方法。

【讨论】:

    【解决方案2】:

    避免将代码放入标记中。

    对于您的用例,您可以使用Literal control

    <%@ Assembly Name="MyAssembly" %>
    <%@ Import Namespace="MyAssembly.MyReportEngine" %>
    <%@ Page Async="true" %>
    
    <html>
    <body>
        <asp:Literal id="ReportHtml" runat="server" />
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      你想念Page.RegisterAyncTask吗?

      public void Page_Load(object sender, EventArgs e)
      {
          RegisterAsyncTask(new PageAsyncTask(GetReportHtml));
      }
      

      参考:https://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx

      【讨论】:

        猜你喜欢
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多