我有一个叫做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上执行。选项应该只是授予或拒绝执行请求的权限。
答案 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时实例化,而不是在构造时使用。