web api cors preflight选项调用执行控制器方法

时间:2016-01-13 18:49:44

标签: angularjs vb.net asp.net-web-api cors

我有一个叫做WebApi的角应用程序。 我启用了身份验证和会话,因此我的获取和帖子需要预检调用。 我在WebApiConfig.vb中启用了Cors

Public Sub Register(config As HttpConfiguration)
    Dim corsAttr = New EnableCorsAttribute("http://localhost:13110", "Origin, Content-Type, Accept, Authorization","GET, PUT, POST, DELETE")
    corsAttr.SupportsCredentials = True
    config.EnableCors(corsAttr)

    config.SuppressDefaultHostAuthentication()
    config.Filters.Add(New HostAuthenticationFilter(OAuthDefaults.AuthenticationType))

*注意:我还必须在identityConfig.vb创建方法

中添加响应头
If (context.Request.Path.Value = "/token") Then
    Dim allowedList() As String = New String() {"http://localhost:13110"}
    Dim credentialsList() As String = New String() {"true"}
    context.Response.Headers.Add("Access-Control-Allow-Origin", allowedList)
    context.Response.Headers.Add("Access-Control-Allow-Credentials", credentialsList)
End If

对API控制器的每个$ http get和post请求在选项请求期间执行控制器方法。所以最终发生的事情是方法被调用两次,一次是在选项上,一次是在Post上。在我看来,该方法不应该在Options上执行。选项应该只是授予或拒绝执行请求的权限。

1 个答案:

答案 0 :(得分:0)

事实证明,选项请求不是调用控制器方法,但它正在击中构造函数。为简单起见,我实例化了构造函数中存储在会话中的变量,这导致我的会话在Options调用以及Get或Post上被点击。我从构造函数中删除了代码,而是使用字段和属性创建了伪单例。

旧代码

    Private _foo As FOO

    Public Sub New()
        _foo = FOO.GetInstance().GetSession()
    End Sub

新代码

    Private fooInstance As FOO

    Private ReadOnly Property _foo As FOO
        Get
            If fooInstance Is Nothing Then
                fooInstance = FOO.GetInstance().GetSession()
            End If
            Return fooInstance 
        End Get
    End Property

现在_foo仅在第一次使用_foo时实例化,而不是在构造时使用。