异步lambda表达式转换为返回'Task'委托的代码块时无法返回值。

7

在我的ASP.NET Core应用程序(Startup.csConfigure方法)中,我有以下内容:

我刚刚添加了async关键字,因为我需要await。 现在,我得到了以下错误:

Error CS8031 异步lambda表达式转换为返回'Task'的委托时无法返回值。 您是否打算返回'Task<T>'?

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ITableRepositories repository)
{
    // ...  
    app.UseStaticFiles();    
    app.UseCookieAuthentication();

    app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
    {
        ClientId = Configuration["..."],
        Authority = Configuration["..."],
        CallbackPath = Configuration["..."],
        Events = new OpenIdConnectEvents
        {
            OnAuthenticationFailed = context => { return Task.FromResult(0); },
            OnRemoteSignOut = context => { return Task.FromResult(0); },
            OnTicketReceived = async context =>
            {
                var user = (ClaimsIdentity)context.Ticket.Principal.Identity;
                if (user.IsAuthenticated)
                {
                    var firstName = user.FindFirst(ClaimTypes.GivenName).Value;
                    // ...
                    List<Connection> myList = new List<Connection>() { c };
                    var results = await repository.InsertOrMergeAsync(myList);
                    var myConnection = (results.First().Result as Connection);                         
                }
                return Task.FromResult(0); // <<< ERROR HERE ....... !!!
            },
            OnTokenValidated = context => { return Task.FromResult(0); },
            OnUserInformationReceived = context => { return Task.FromResult(0); },
        }
    });

    app.UseMvc(routes =>        { ...        });
}

enter image description here

在这种情况下我应该返回什么?我尝试过return 0;,但错误信息没有改变...

附注:OnTicketRecieved的签名。

namespace Microsoft.AspNetCore.Authentication
{
    public class RemoteAuthenticationEvents : IRemoteAuthenticationEvents
    {
        public Func<TicketReceivedContext, Task> OnTicketReceived { get; set; }

2
请不要删除您的问题,因为它已经关闭并重新创建一个完全相同的问题以摆脱关闭投票和评论。此外,当您删除原始问题时,我正准备回答您的问题... - poke
“OnTicketReceived” 期望的委托类型是什么? - Mike Strobel
@MikeStrobel 我更新了原帖以解释它。 - serge
3
听起来 OnTicketReceived 想要一个返回 Task 的委托,也就是一个没有结果的任务。我猜当你添加了 async 后,你的 lambda 的隐式返回类型变成了 async Task。这意味着你不能返回一个值,所以把你的 lambda 当作返回 void 来处理。只需完全删除你的返回语句即可。 - Mike Strobel
1个回答

13
错误信息实际上已经很明确了:
异步 lambda 表达式转换为返回委托的 Task 时不能返回值。你是否打算返回 Task?
因此,您有一个异步 lambda 表达式,它应该返回一个 Task,而不是任何 T 的 Task。
但是当您执行 return 0 时,您返回了一个 int,所以您的异步方法的返回类型是 Task,而不是 Task。编译器想要您在那里返回没有值
OnTicketReceived = async context =>
{
    await Task.Delay(100);
    return;
}

1
由于SO编辑器,Task<T>文本被转换为Task,因此我的引用不正确。已修复。如果您不需要代码,请不要对我进行负面评价并要求代码。 - serge
那么在这种情况下,你如何返回结果呢?比如HTTP状态码和消息? - Daniel Williams
@DanielWilliams 事件处理程序应该与传递的“context”交互,如果他们想要控制身份验证流程。如果您想终止HTTP请求,可以直接写入HttpContext的响应,但我建议在身份验证事件中执行此操作,因为这很可能会以不可恢复的方式中断身份验证过程。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接