![](/img/trans.png)
[英]How to return 403 Forbidden response as IActionResult in ASP.NET Core
[英]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.