在自托管 WCF 服务上出现 CORS 错误 App.configCustomHeaderMessageInspectorBehaviorAttributeFor exemple

问题描述

我正在尝试将 CORS 实施到我的 WCF 服务中。我没有 global.asax 文件。 所以我跟着this solution

没有任何反应,没有添加标题,Chrome 仍然给我一个错误

对预检请求的响应未通过访问控制检查:请求的资源上不存在“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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...