VB.NET Web API CORS PUT 预检 405 错误

Posted

技术标签:

【中文标题】VB.NET Web API CORS PUT 预检 405 错误【英文标题】:VB.NET Web API CORS PUT Preflight 405 Error 【发布时间】:2015-02-04 10:40:49 【问题描述】:

我正在使用启用了 CORS 的 WEB API,并且我的 GET 和 POST 运行良好。但是我的 PUT 不能通过 CORS 工作。我可以在 Chrome 中使用“高级 REST”扩展,而且效果很好。我在 web config 中有各种设置

更新:我想指出我的 POST 通过 CORS 工作。其中,如果我理解该过程首先发送一个 OPTION 动词。那个 OPTION 动词会通过,但是 PUT 不会。

更新 2:因此 PUT(OPTIONS)动词似乎需要预检。而且我想我没有那个,我真的找不到如何制作它。

<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<remove name="WebDAV" />
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>

$.ajax(
    type: "PUT",
    dataType: "json",
    url: url,
    contentType: "application/json",
    data: newMod,
    success: function (data) 
        OutfitModelKey = data;
        console.log(data);
        console.log(OutfitModelKey);
        if (callback) 
            callback();
        
    ,
    error: function (error) 
        alert("hi, error");
        //jsonValue = jQuery.parseJSON(error.responseText);
        //console.log(jsonValue);
        //ToastDanger("uh o!", jsonValue);
        //jError('An error has occurred while saving the new part source: ' + jsonValue,  TimeShown: 3000 );
    
);

' PUT api/OutfitModel/5
Public Function PutOutfitModel(ByVal id As Integer, <FromBody()> ByVal value As PhotoModelManagerCL.objOutfitModel) As Boolean
    value.OutfitModelKey = id
    Dim success As Boolean = PhotoModelManagerCL.UpdateobjOutfitModelByKey(value)
    Return success
End Function

【问题讨论】:

你能展示一下你的控制器的Put方法吗? 你的 jquery 代码使用的 api url 是什么? @Omar.Alani URL 位于 chrome 控制台中。 10.0.0.54:8001/api/outfitmodel/77 - 问题中的控件已更新。 【参考方案1】:

看起来指定方法明确解决了问题

 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
 </httpProtocol>

PUT 动词的情况下,还有一个预请求(有人称之为预检):Options

要处理它,您需要发回一个空响应。您可以在您的操作中执行此操作,或者您可以像这样在全局范围内执行此操作:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    If Request.Headers.AllKeys.Contains("Origin") And Request.HttpMethod = "OPTIONS" Then
        Response.Flush()
    End If
End Sub

C# 等效

protected void Application_BeginRequest()

    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    
        Response.Flush();
    

【讨论】:

不行!我认为这肯定会奏效。但仍然收到 405 错误。 content.screencast.com/users/jharris8567/folders/Jing/media/… 那么这个调用去哪里了,我是在我的 vb 中调用它还是...? 它转到 Global.asax。我已经用 VB.NET 版本更新了我的答案。 我现在在 DELETES 上也遇到了这个错误。删除是否需要不同的预检。 应该是同一个预检。

以上是关于VB.NET Web API CORS PUT 预检 405 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用具有多个来源的 PUT 和 DELETE 请求时如何解决 ASP.NET Web API CORS Preflight 问题?

4CORS跨域请求限制与解决(预请求)

CORS 预检返回 200,但随后的 PUT 从未发生(带有外部 REST API 的 Angular JS)

仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误

访问被 CORS 阻止的 XMLHttpRequest,请求的资源上不存在“Access-Control-Allow-Origin”标头,仅用于 PUT 和 DELETE API

AWS S3 通过预签名 URL 上传返回 400 错误请求