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 中发送的主要内容,如果未能解决你的问题,请参考以下文章
CORS withCredentials XHR 预检未在 Firefox 中发布 Cookie
来自 IE 或 Firefox 的 CORS 请求中没有 Referer 标头