CORS 请求标头参数未在 Chrome 中发送

Posted

技术标签:

【中文标题】CORS 请求标头参数未在 Chrome 中发送【英文标题】:CORS request header parameters not sending in Chrome 【发布时间】:2016-10-30 22:59:08 【问题描述】:

我尝试使用 swagger ui 来获取 rest api 文档。使用 WCF 服务创建的 Rest API。我解决了 cors 问题,服务接受 OPTIONS 方法。但是请求有一个名称为 SessionUUID 的标头参数,此参数不会发送到服务。当我调试服务端时,这个参数没有出现。此问题仅存在于 Chrome 中。 Chrome 会阻止 cors 请求中的标头参数。

像这样在 WCF 服务上解决 Cors 问题;

    我添加了新的行为并定义了标头参数

    public class EnableCorsEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
    
       ...
    
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        
            var requiredHeaders = new Dictionary<string, string>();
    
            requiredHeaders.Add("Access-Control-Allow-Origin", "*");
            requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS");
            requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept, Accept-Language, SessionUUID, Origin, X-Custom-Header, sessionuuid");
            requiredHeaders.Add("Access-Control-Allow-Credentials", "true");
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new ServiceInspector(requiredHeaders));
            
       ...
      
    

      我在检查器中添加了响应标头。由于这个问题,在 AfterReceiveRequest 中检查了名为 SessionUUID 的 Header 参数,但它是 null

      public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
      
          try
          
      
      
              WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
              string requestTo = request.Headers.To.ToString();
      
      
              if (!requestTo.Contains("login") && request.GetType().Name != "InternalByteStreamMessage")
              
                  if (headers["SessionUUID"] == null)
                  
                      throw new RestAppException("401", "Oturum bilgisi bulunamadı.");
                  
                  else
                  
                      DateTime requestDate = DateTime.Now;
                      string sessionUUID = headers["SessionUUID"] != null ? headers["SessionUUID"].AsString() : headers["sessionuuid"].AsString();
                      sessionManager.CheckSessionByUUID(sessionUUID, requestDate);
      
                      sessionManager.UpdateExpireDate(sessionUUID, requestDate);
                      sessionManager.SetSessionByUUID(sessionUUID);
                  
              
          
          catch (RestAppException ex)
          
              ex.Message = "İşlem Başarısız";
              throw ex;
          
          catch (Exception ex)
          
              throw ex;
          
      
          return null;
      
      
      public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
      
          var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
          foreach (var item in requiredHeaders)
          
              httpHeader.Headers.Add(item.Key, item.Value);
          
      
      

我该如何解决这个 chrome 问题?

【问题讨论】:

【参考方案1】:

您必须添加 Chrome 扩展程序才能允许自定义标题。

这里有一些你可以使用的:

    WebRequestAPI Mod Header

如果您想试用 Mozilla Firefox,请使用其扩展名modify-headers。

【讨论】:

Mod Header 工作非常感谢。但我需要在服务器端解决这个问题。 尝试添加这个:requiredHeaders.Add("Access-Control-Expose-Headers", "SessionUUID");【参考方案2】:

我遇到了类似的问题。可能和url有关。

当我输入“www”时,我的问题解决了。

如果您已经输入了“www”,请将其删除并重试。

【讨论】:

以上是关于CORS 请求标头参数未在 Chrome 中发送的主要内容,如果未能解决你的问题,请参考以下文章

仅当有标头时,Chrome 中的 CORS 请求才会失败

CORS withCredentials XHR 预检未在 Firefox 中发布 Cookie

来自 IE 或 Firefox 的 CORS 请求中没有 Referer 标头

CORS:成功 OPTIONS 请求后,Firefox 不发送 POST 请求……在 Chrome 中有效

为啥 Chrome 会取消 CORS OPTION 请求

Safari 中的 CORS 错误,而不是 Chrome