gpt4 book ai didi

Servicestack CorsFeature 全局选项处理程序不会在某些路由上触发;

转载 作者:行者123 更新时间:2023-12-04 07:23:32 24 4
gpt4 key购买 nike

我已经使用 CorsFeature 进行了服务设置,并且正在使用 mythz 在其他答案中建议的方法,该方法收集在 appHost 文件中使用的函数中:

private void ConfigureCors(Funq.Container container)
{
Plugins.Add(new CorsFeature(allowedOrigins: "*",
allowedMethods: "GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders: "Content-Type, Authorization, Accept",
allowCredentials: true));

PreRequestFilters.Add((httpReq, httpRes) =>
{
//Handles Request and closes Responses after emitting global HTTP Headers
if (httpReq.HttpMethod == "OPTIONS")
{
httpRes.EndRequest();
}
});
}

但是,预请求过滤器仅针对某些服务请求触发。我们在服务中的基本实体之一是问题实体,自定义路由定义如下:
[Route("/question")]
[Route("/question/{ReviewQuestionId}", "GET,DELETE")]
[Route("/question/{ReviewQuestionId}/{ReviewSectionId}", "GET")]

使用 POSTMAN 触发测试查询(全部使用 OPTIONS 动词),我们可以看到这将触发预请求过滤器:
http://localhost/myservice/api/question/

但这不会:
http://localhost/myservice/api/question/66

据推测,这是因为第二条和第三条路线明确定义了它们接受的动词,而 OPTIONS 不是其中之一。

真的有必要在每个定义的路由中拼出 OPTIONS 来限制支持的动词吗?

最佳答案

PreRequestFilters 仅针对不排除 OPTIONS 的有效路由触发(例如,通过离开 Verbs=null 并允许它处理所有动词 - 包括 OPTIONS)。

为了能够处理所有 OPTIONS 请求(即即使对于不匹配的路由),您需要在 start of the Request pipeline 处处理请求(即在路由匹配之前)与 Config.RawHttpHandlers .这是在 CorsFeature 中完成的在 ServiceStack 的下一个主要 (v4) 版本中为您提供:

//Handles Request and closes Response after emitting global HTTP Headers
var emitGlobalHeadersHandler = new CustomActionHandler(
(httpReq, httpRes) => httpRes.EndRequest());

appHost.RawHttpHandlers.Add(httpReq =>
httpReq.HttpMethod == HttpMethods.Options
? emitGlobalHeadersHandler
: null);

CustomActionHandler 在 v3 中不存在,但它很容易创建:
public class CustomActionHandler : IServiceStackHttpHandler, IHttpHandler 
{
public Action<IHttpRequest, IHttpResponse> Action { get; set; }

public CustomActionHandler(Action<IHttpRequest, IHttpResponse> action)
{
if (action == null)
throw new Exception("Action was not supplied to ActionHandler");

Action = action;
}

public void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName)
{
Action(httpReq, httpRes);
}

public void ProcessRequest(HttpContext context)
{
ProcessRequest(context.Request.ToRequest(GetType().Name),
context.Response.ToResponse(),
GetType().Name);
}

public bool IsReusable
{
get { return false; }
}
}

使用回退处理程序

另一种匹配所有路由的方法是指定一个 FallbackRoute ,例如要处理所有路由,您可以使用以下命令向回退路由添加通配符:
[FallbackRoute("/{Path*}")]
public class Fallback
{
public string Path { get; set; }
}

但是当它匹配所有未处理的路由时,它不再为不匹配的请求提供 404,因为所有未匹配的路由现在都匹配了。但是您可以通过以下方式轻松地手动处理它:
public class FallbackService : Service
{
public object Any(Fallback request)
{
if (base.Request.HttpMethod == "OPTIONS")
return null;

throw HttpError.NotFound("{0} was not found".Fmt(request.Path));
}
}

关于Servicestack CorsFeature 全局选项处理程序不会在某些路由上触发;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com