繁体   English   中英

从ASP.NET Core中的WebSocket请求返回什么IActionResult?

[英]What IActionResult to return from a WebSocket request in ASP.NET Core?

我正在运行一个正在侦听Web套接字请求的ASP.NET Core 2.1 webapi。 如果请求不是针对WebSocket升级的,我想return this.BadRequest()

[Route("api/[controller]")]
[ApiController]
public class SocketController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> Post()
    {
        if (!this.HttpContext.WebSockets.IsWebSocketRequest)
            return this.BadRequest();

        using (var webSocket = await this.HttpContext.WebSockets.AcceptWebSocketAsync())
        {
            using (var jsonRpc = new JsonRpc(new WebSocketMessageHandler(webSocket)))
            {
                jsonRpc.AddLocalRpcTarget(new SocketServer());
                jsonRpc.StartListening();
                await jsonRpc.Completion;
            }
        }

        return this.Ok();
    }
}

但是,无论是采用成功路径还是失败路径,服务器都会引发异常:

失败:Microsoft.AspNetCore.Server.Kestrel [13]连接ID“ 0HLEM87126JEO”,请求ID“ 0HLEM87126JEO:00000001”:应用程序引发了未处理的异常。 System.InvalidOperationException:无法设置StatusCode,因为响应已经开始。 在Microsoft.AspNetCore.Server处Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.set_StatusCode(Int32值)处Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAlreadyStartedException(字符串值) .Kestrel.Core.Internal.Http.HttpProtocol.Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.set_StatusCode(Int32值)位于Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_StatusCode(Int32值)位于Microsoft.AspNetCore.Mvc.StatusCodeResult Microsoft.AspNetCore.Mvc.ActionResult.ExecuteResultAsync(ActionContext上下文)处的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsyncTFilter,TFilter的.ExecuteResult(ActionContext上下文)在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext(TFilter,TFilterAsync)处的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext上下文) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()(在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()在Microsoft.AspNetCore.Mvc.Internal.ResourceInvo Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next上的.Rethrow(ResourceExecutedContext上下文)Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()上的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)上的Mvc.Internal.ResourceInvoker.InvokeAsync()Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(Http.net上下文下) )在Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests [TContext](IHttpApplication`1应用程序)

如果我将方法更改为仅返回Task那么它可以正常Task因此我不必提供IActionResult ,但是我没有办法返回对错误请求的400个响应。 最好的方法是什么?

我的中间件非常简单:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // app.UseHsts();
        }

        // app.UseHttpsRedirection();
        app.UseWebSockets();
        app.UseMvc();
    }

秘密是EmptyResult ,它没有this.Empty()方法。

public async Task<IActionResult> Post()
{
    if (!this.HttpContext.WebSockets.IsWebSocketRequest)
    {
        return this.BadRequest();
    }

    using (var webSocket = await this.HttpContext.WebSockets.AcceptWebSocketAsync())
    {
        using (var jsonRpc = new JsonRpc(new WebSocketMessageHandler(webSocket)))
        {
            jsonRpc.AddLocalRpcTarget(new SocketServer());
            jsonRpc.StartListening();
            await jsonRpc.Completion;
        }
    }

    return new EmptyResult();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM