无法将 Access-Control-Allow-Origin 添加到我的 WCF 库项目
Posted
技术标签:
【中文标题】无法将 Access-Control-Allow-Origin 添加到我的 WCF 库项目【英文标题】:Could not add Access-Control-Allow-Origin to my WCF library Project 【发布时间】:2012-06-01 10:10:16 【问题描述】:我试图理解为什么这个调用的 ajax 不起作用
$.ajax(
type: 'GET',
url: "http://localhost:8732/Design_Time_Addresses/InMotionGIT_NT.Address.Service/AddressService/json/capitalize",
data: streetAddress : JSON.stringify(streetAddress) , consumer : JSON.stringify(consumer) ,
datatype: "jsonp",
success: function (data)
$('body').append('<div>'+data.IDblah+' '+ data.prueba+'</div>');
alert(data.IDblah);
接收数据的服务正确接收并且响应正确。为什么我做错了?
我尝试将此属性添加到调用的 ajax 但没有成功crossDomain : true
[OperationContract()]
[WebInvoke(Method="GET", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]
public string Capitalize(StreetAddress streetAddress,ConsumerInformation consumer)
我得到的错误是常见的
XMLHttpRequest cannot load Origin http://localhost:50816 is not allowed by Access-Control-Allow-Origin.
更新
我尝试通过在我的App.config
文件中添加配置来将标头添加到响应中,但没有成功
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
【问题讨论】:
我也遇到了同样的问题,请问您的问题是怎么解决的?谢谢。 【参考方案1】:把它放在你的配置文件的服务端
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
它对我有用!谢谢!
【讨论】:
在我的 WCF REST 和 SOAP Web 服务上为我工作:)【参考方案2】:此链接会有所帮助:http://enable-cors.org/
您需要在发送回客户端的响应中添加以下标头:
//允许所有域
Access-Control-Allow-Origin: *
或
//允许特定域
Access-Control-Allow-Origin: http://example.com:8080 http://foo.example.com
【讨论】:
也应该是数据类型而不是数据类型。同样在上面尝试将响应放入脚本标记中,如果它没有包装在服务器上 好的,所以我将配置添加到我的项目中,但仍然没有将标头发送给客户端我用我的配置更新了我的问题 这里也一样,我添加了相同的几个自定义类,它确实符合该逻辑,但响应仍然没有标题。【参考方案3】:解决办法是创建一个文件 Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
【讨论】:
【参考方案4】:直接在 Visual Studio、Chrome 和 Firefox 中使用 WCF 服务时,我遇到了同样的问题。 我用以下方法修复了它:
使用以下函数编辑 Global.asax 文件:
private void EnableCrossDomainAjaxCall()
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
HttpContext.Current.Response.End();
然后从
调用函数 protected void Application_BeginRequest(object sender, EventArgs e)
EnableCrossDomainAjaxCall();
您可以从以下网址获取更多信息:
http://blog.blums.eu/2013/09/05/restfull-wcf-service-with-cors-and-jquery-and-basic-access-authentication.
【讨论】:
【参考方案5】:另一种处理方式,更适合自托管服务,可以找到here。
【讨论】:
【参考方案6】:对于 WCF 服务,您必须开发新行为并将其包含在端点配置中:
创建消息检查器
public class CustomHeaderMessageInspector : IDispatchMessageInspector
Dictionary<string, string> requiredHeaders;
public CustomHeaderMessageInspector (Dictionary<string, string> headers)
requiredHeaders = headers ?? new Dictionary<string, string>();
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
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);
创建端点行为并使用消息检查器添加标题
public class EnableCrossOriginResourceSharingBehavior : BehaviorExtensionElement, IEndpointBehavior
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
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");
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders));
public void Validate(ServiceEndpoint endpoint)
public override Type BehaviorType
get return typeof(EnableCrossOriginResourceSharingBehavior);
protected override object CreateBehavior()
return new EnableCrossOriginResourceSharingBehavior();
在 web.config 中注册新行为
<extensions>
<behaviorExtensions>
<add name="crossOriginResourceSharingBehavior" type="Services.Behaviours.EnableCrossOriginResourceSharingBehavior, Services, Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
向端点行为配置添加新行为
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp />
<crossOriginResourceSharingBehavior />
</behavior>
</endpointBehaviors>
配置端点
<endpoint address="api" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="Service.IServiceContract" />
【讨论】:
我也面临同样的问题,我使用了你的代码,现在我面临以下错误“类型'Services.Behaviours.EnableCrossOriginResourceSharingBehavior, Services, Version=1.0.0.0, Culture=neutral'注册扩展无法加载“crossOriginResourceSharingBehavior””以上是关于无法将 Access-Control-Allow-Origin 添加到我的 WCF 库项目的主要内容,如果未能解决你的问题,请参考以下文章
ABP PUTDELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词) 引发客户端错误 No 'Access-Control-Allow