如何解决在自托管 WCF 服务上出现 CORS 错误 App.configCustomHeaderMessageInspectorBehaviorAttributeFor exemple
我正在尝试将 CORS 实施到我的 WCF 服务中。我没有 global.asax 文件。 所以我跟着this solution。
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
App.config
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<bindings>
<!--basicHttpBinding-->
<basicHttpBinding>
<binding name="BasicBinding" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="##.ServiceScanClientService" behaviorConfiguration="serviceBehavior">
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="##.IServiceScanClientService" />
</service>
</services>
<extensions>
<behaviorExtensions>
<add name="crossOriginResourceSharingBehavior" type="##.BehaviorAttribute,ServiceScan " />
</behaviorExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<crossOriginResourceSharingBehavior />
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
CustomHeaderMessageInspector
public class CustomHeaderMessageInspector : IdispatchMessageInspector
{
Dictionary<string,string> requiredHeaders;
public CustomHeaderMessageInspector(Dictionary<string,string> headers)
{
requiredHeaders = headers ?? new Dictionary<string,string>();
}
public object AfterReceiveRequest(ref Message request,IClientChannel channel,InstanceContext instanceContext)
{
string displayText = $"Server has received the following message:\n{request}\n";
Console.WriteLine(displayText);
return null;
}
public void BeforeSendReply(ref Message reply,object correlationState)
{
var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
foreach (var item in requiredHeaders)
{
httpHeader.Headers.Add(item.Key,item.Value);
}
}
}
BehaviorAttribute
public class BehaviorAttribute : 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","Content-Type");
endpointdispatcher.dispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders));
}
public void Validate(ServiceEndpoint endpoint) { }
public override Type BehaviorType
{
get { return typeof(BehaviorAttribute); }
}
protected override object CreateBehavior()
{
return new BehaviorAttribute();
}
}
然后我使用 Ajax 在客户端执行 http 请求。
For exemple
$.ajax({
url: serviceURL,timeout: 2000,success: function (data) {
if (onSuccessCallback != undefined) {
var result = ResponseHandler(data,onErrorCallback);
if (result != false)
onSuccessCallback(data.Resultat);
}
return true;
},error: function (resultat,statut,error) {
if (onErrorCallback != undefined) {
onErrorCallback(error);
}
else
throw new Error('Ping Error ' + error);
return false;
},type: 'GET',dataType: 'JSON',timeout: delay,crossDomain: true
});
我尝试将 dataType 设置为“JSONP”,它起作用了,但由于我也有 POST 请求,因此我没有保留该解决方案,因为它只允许 GET。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。