servicestack.net的OPTIONS请求返回404是否重要?

3
我正在使用在https://github.com/ServiceStack/ServiceStack/wiki/New-Api中描述的方法启用CORS。 这似乎有效,也就是说,我在响应中收到了正确的Access-Control标头,但状态码是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

UPDATE 1

This is my resource type.

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

POST请求工作正常。


你能展示一下你使用的[EnableCors]服务以及造成404的请求吗? - mythz
@mythz 我已经添加了那些 - 如果你需要更多信息,请告诉我。 - Adam Ralph
1
真是太糟糕了,我自己也遇到了这个问题。根据HTTP规范,我本来期望是405而不是404。 - Bealer
2个回答

3

我还没有看到与预期路由/apikeyrequests相匹配的内容。

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

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

为请求添加了什么?


请参见更新1。我需要省略“POST”参数吗?还是应该将其更改为“POST”,“OPTIONS”? - Adam Ralph
是的,POST路由将匹配HTTP POST请求。您可以删除过滤器,使其适用于所有动词,或者添加特定的OPTIONS(以及其他您想要匹配路由的动词)。类似地,您可以使用Any(ApiKeyRequest req)而不是Options(ApiKeyRequest req)来处理并添加过滤器到任何路由。 - mythz
非常感谢。将OPTIONS添加到路由属性中就解决了问题。 - Adam Ralph

2
CORS规范明确指出,非200的预检响应是一种错误。请参见此处的“如果响应具有非200的HTTP状态代码”部分:http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0。我不知道这个要求的动机是什么。也许是因为404会引起混淆,让人们无法确定端点是否真的存在。

+1 我猜我的帖子里不仅仅是“问题”,这肯定回答了其中一个,谢谢。 - Adam Ralph

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