Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于自托管WCF服务的CORS_Wcf_Self_Hosted_Idispatchmessageinspector - Fatal编程技术网

基于自托管WCF服务的CORS

基于自托管WCF服务的CORS,wcf,self,hosted,idispatchmessageinspector,Wcf,Self,Hosted,Idispatchmessageinspector,我正在尝试在我的WCF服务中实现CORS suppor 我从你那里得到一些密码 错误:类只能从其他类继承 如何继承IDispatchMessageInspector 谢谢我做了一个演示,希望对你有用。 参考。 using System; using System.Collections.Generic; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Configu

我正在尝试在我的WCF服务中实现CORS suppor

我从你那里得到一些密码

错误:类只能从其他类继承

如何继承IDispatchMessageInspector


谢谢

我做了一个演示,希望对你有用。
参考。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Web;
class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost sh = new ServiceHost(typeof(MyService)))
            {
                sh.Open();
                Console.WriteLine("service is ready...");
                Console.ReadLine();
                sh.Close();
            }

        }
    }
    [ServiceContract(Namespace = "mydomain")]
    public interface IService
    {
        [OperationContract]
        [WebGet(ResponseFormat =WebMessageFormat.Json)]
        string SayHello();
    }
    public class MyService : IService
    {
        public string SayHello()
        {
            return $"Hello, busy World,{DateTime.Now.ToShortTimeString()}";
        }
    }
    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);
            }

            string displayText = $"Server has replied the following message:\n{reply}\n";
            Console.WriteLine(displayText);

        }
    }
    public class CustomContractBehaviorAttribute : BehaviorExtensionElement, IEndpointBehavior
    {
        public override Type BehaviorType => typeof(CustomContractBehaviorAttribute);

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 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)
        {

        }


        protected override object CreateBehavior()
        {
            return new CustomContractBehaviorAttribute();
        }
    }
    <script>
    $(function(){
        $.ajax({
            method:"Get",
            url: "http://10.157.13.69:5638/sayhello",
            dataType:"json",
            success: function(data){
                $("#main").html(data);
            }
        })
    })
</script>
服务器。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Web;
class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost sh = new ServiceHost(typeof(MyService)))
            {
                sh.Open();
                Console.WriteLine("service is ready...");
                Console.ReadLine();
                sh.Close();
            }

        }
    }
    [ServiceContract(Namespace = "mydomain")]
    public interface IService
    {
        [OperationContract]
        [WebGet(ResponseFormat =WebMessageFormat.Json)]
        string SayHello();
    }
    public class MyService : IService
    {
        public string SayHello()
        {
            return $"Hello, busy World,{DateTime.Now.ToShortTimeString()}";
        }
    }
    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);
            }

            string displayText = $"Server has replied the following message:\n{reply}\n";
            Console.WriteLine(displayText);

        }
    }
    public class CustomContractBehaviorAttribute : BehaviorExtensionElement, IEndpointBehavior
    {
        public override Type BehaviorType => typeof(CustomContractBehaviorAttribute);

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 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)
        {

        }


        protected override object CreateBehavior()
        {
            return new CustomContractBehaviorAttribute();
        }
    }
    <script>
    $(function(){
        $.ajax({
            method:"Get",
            url: "http://10.157.13.69:5638/sayhello",
            dataType:"json",
            success: function(data){
                $("#main").html(data);
            }
        })
    })
</script>
类程序
{
静态void Main(字符串[]参数)
{
使用(ServiceHost sh=新ServiceHost(typeof(MyService)))
{
sh.Open();
Console.WriteLine(“服务准备就绪…”);
Console.ReadLine();
sh.Close();
}
}
}
[ServiceContract(Namespace=“mydomain”)]
公共接口设备
{
[经营合同]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
字符串SayHello();
}
公共类MyService:IService
{
公共字符串SayHello()
{
return$“你好,忙碌的世界,{DateTime.Now.ToShortTimeString()}”;
}
}
公共类CustomHeaderMessageInspector:IDispatchMessageInspector
{
词典要求的标题;
public CustomerHeaderMessageInspector(字典标题)
{
requiredHeaders=标题??新字典();
}
接收请求后的公共对象(ref消息请求、IClientChannel通道、InstanceContext InstanceContext)
{
string displayText=$“服务器已收到以下消息:\n{request}\n”;
Console.WriteLine(显示文本);
返回null;
}
SendReply之前的公共无效(参考消息回复,对象关联状态)
{
var httpHeader=reply.Properties[“httpResponse”]作为HttpResponseMessageProperty;
foreach(RequiredHeader中的var项)
{
httpHeader.Headers.Add(item.Key,item.Value);
}
string displayText=$“服务器已回复以下消息:\n{reply}\n”;
Console.WriteLine(显示文本);
}
}
公共类CustomContractBehaviorAttribute:BehaviorExtensionElement,IEndpointBehavior
{
公共重写类型BehaviorType=>typeof(CustomContractBehaviorAttribute);
public void AddBindingParameters(ServiceEndpoint端点、BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint端点、ClientRuntime ClientRuntime)
{
}
公共无效ApplyDispatchBehavior(ServiceEndpoint端点、EndpointDispatcher端点Dispatcher)
{
var requiredHeaders=新字典();
requiredHeaders.Add(“访问控制允许来源”、“*”);
添加(“访问控制请求方法”、“POST、GET、PUT、DELETE、OPTIONS”);
requiredHeaders.Add(“访问控制允许头”,“X请求的,内容类型”);
endpointDispatcher.DispatcheRuntime.MessageInspectors.Add(新的CustomHeaderMessageInspector(requiredHeaders));
}
公共void验证(ServiceEndpoint)
{
}
受保护的重写对象CreateBehavior()
{
返回新的CustomContractBehaviorAttribute();
}
}
App.config

<system.serviceModel>
    <services>
      <service name="Server3.MyService" behaviorConfiguration="mybahavior">
        <endpoint address="" binding="webHttpBinding" contract="Server3.IService" behaviorConfiguration="rest"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:5638"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mybahavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp />
          <CorsBehavior />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add name="CorsBehavior" type="Server3.CustomContractBehaviorAttribute, Server3" />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>


如果有什么我可以帮忙的,请随时告诉我。

您应该补充

Dim method = httpRequest.Method
If method.ToLower() = "options" Then httpResponse.StatusCode = System.Net.HttpStatusCode.NoContent

在BeforeSendReply结尾处的示例中,否则至少POST请求将不起作用。

是否包含对System.ServiceModel.Dispatcheries的引用。包括System.ServiceModel.Dispatcher我唯一能从@mahlatse获得错误信息的参考信息,谢谢。但我对网页上提供的解决方案一无所知