-1

我对 WCF 很陌生。我有一个使用控制台应用程序托管的 WCF 服务,但是需要从托管在同一台机器上的 C# web 服务调用 WCF。那么如何限制端点访问环回ip,即127.0.0.1

现在我可以访问托管在不同机器上的 WCF 服务端点(比如 10.XXX)。例如,我可以输入http://10.XXX/api/v1/getStatus并获得响应。这个网址应该被限制。我的要求是只有http://localhost/api/v1/getStatus应该能够从托管的 WCF 服务中获取响应。

4

2 回答 2

1

根据您的具体情况,您可以使用命名管道。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-transport?redirectedfrom=MSDN

于 2020-09-21T05:17:24.143 回答
0

在您提供的链接中,IPFilter 是一个自定义节点,它实现了 IDispatchMessageInspector 接口来拦截 IP。这是我的演示:

   public class ServerMessageLogger : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        OperationContext context = OperationContext.Current;
        MessageProperties messageProperties = context.IncomingMessageProperties;
        RemoteEndpointMessageProperty endpointProperty =
          messageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
        if (endpointProperty.Address.Equals("::1"))
        {
            Console.WriteLine("OK");
        }
        else
        {
            reply = null;
        }
    }
}

我们需要实现 IDispatchMessageInspector 接口。当服务器向客户端发送响应时,首先判断客户端的IP地址是否为localhost。如果不是本地主机,服务器将返回一个空响应。

 [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
    public class CustContractBehaviorAttribute : Attribute, IContractBehavior
    {
        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            return;
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            return;
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
            dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
        }

        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
            return;
        }
    }

然后我们需要将 ServerMessageLogger 添加到服务的行为中。

在此处输入图像描述

最后,您需要将 CustContractBehavior 应用于服务。

于 2020-09-22T05:19:19.253 回答