【问题标题】:Does it matter that a servicestack.net OPTIONS request returns a 404?servicestack.net OPTIONS 请求返回 404 是否重要?
【发布时间】:2012-11-06 01:14:31
【问题描述】:

我正在使用https://github.com/ServiceStack/ServiceStack/wiki/New-Api 中描述的方法来启用 CORS。这似乎可行,即我在响应中得到了正确的访问控制标头,但状态码是 404。这有关系吗?

为了完整起见,我更愿意返回一个非错误代码。阅读http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 似乎我应该返回 200。最好的方法是什么?

服务方法定义为:-

    [EnableCors]
    public void Options(ApiKeyRequest apiKeyRequest)
    {
    }

HTTP 请求是:-

OPTIONS http://myreallycoolwebapi/apikeyrequests HTTP/1.1
Host: myreallycoolwebapi
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Access-Control-Request-Headers: origin, content-type, accept
Accept: */*
Referer: http://localhost:8000/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

响应是:-

HTTP/1.1 404 Not Found
Server: nginx
Date: Sat, 17 Nov 2012 18:06:01 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 3
Connection: keep-alive
Cache-Control: private
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type

404

更新 1

这是我的资源类型。

[Route("/apikeyrequests", "POST")]
public class ApiKeyRequest : IReturn<ApiKeyRequest>
{
    public string EmailAddress { get; set; }
}

POST 请求工作正常。

【问题讨论】:

  • 您能否展示一下您正在使用的 [EnableCors] 服务以及您提出的导致 404 错误的请求?
  • @mythz 我已经添加了这些 - 如果您需要更多信息,请告诉我
  • 该死的,我自己也遇到过这个问题。会期望 405(根据 HTTP 规范)而不是 404。

标签: c# http servicestack cors


【解决方案1】:

我仍然没有看到任何符合预期路线/apikeyrequests的东西。

您是否有自定义路由定义,例如:

[Route("/apikeyrequests")]
public class ApiKeyRequest {}

为请求添加?

【讨论】:

  • 参见更新 1。我需要省略“POST”参数吗?还是应该改成“POST”、“OPTIONS”?
  • 是的 POST 路由将匹配 HTTP POST 请求。您可以删除过滤器,使其适用于所有动词或专门添加 OPTIONS(在您希望路由匹配的其他动词中)。同样,您可以使用 Any(ApiKeyRequest req) 而不是 Options(ApiKeyRequest req) 来处理过滤器并将其添加到 any 路线。
  • 非常感谢。将 OPTIONS 添加到 Route 属性就可以了。
【解决方案2】:

CORS 规范本身明确指出非 200 预检响应是一个错误。请参阅此处的“如果响应的 HTTP 状态代码不是 200”部分:

http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

我不知道这个要求的动机是什么。可能是因为 404 可能会导致端点是否实际存在的混淆。

【讨论】:

  • +1 我想我的帖子中不仅仅是“问题”,这肯定回答了其中一个问题,谢谢。
猜你喜欢
  • 2017-04-19
  • 2017-10-20
  • 2012-12-22
  • 1970-01-01
  • 2014-12-27
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多