C# 更改WSDL中生成的服务引用调用的HTTP主机头

C# 更改WSDL中生成的服务引用调用的HTTP主机头,c#,http,wcf,wsdl,endpoint,C#,Http,Wcf,Wsdl,Endpoint,我的计算机中有一个指向本地端点的WSDL链接。我已经生成了服务引用,当我在本地执行时,可以很好地访问所有内容。http://localhost/ApplicationHost/EndPoint 如果我使用另一台计算机(在网络中),请求将通过IP即H完成ttp://15.5.20.10/ApplicationHost/EndPoint 但这将响应400个错误请求 将请求的主机更改为“localhost”(在firefox和android上测试)效果良好 图像具有完美的功能案例。该地址具有IP,主

我的计算机中有一个指向本地端点的WSDL链接。我已经生成了服务引用,当我在本地执行时,可以很好地访问所有内容。http://localhost/ApplicationHost/EndPoint

如果我使用另一台计算机(在网络中),请求将通过IP即H完成ttp://15.5.20.10/ApplicationHost/EndPoint 但这将响应400个错误请求

将请求的主机更改为“localhost”(在firefox和android上测试)效果良好

图像具有完美的功能案例。该地址具有IP,主机为“localhost”,但我无法在c#中复制此地址


如何使用C#和服务引用实现同样的功能?到目前为止,我已经尝试了许多添加http头的解决方案,但没有一个会意外地更改现有的头:即,在客户端,我们可以通过IClientMessageInspector修改头,下面是一个演示:

   public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        { 
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            HttpRequestMessageProperty header;
            if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name))
            {
                header = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
            }
            else
            {
                header = new HttpRequestMessageProperty();
                request.Properties.Add(HttpRequestMessageProperty.Name, header);
            }

            header.Headers["Host"] = "localhost";
            return null;
        }
    }
ClientMessageLogger实现IClientMessageInspector接口,我在客户端发布请求之前修改其请求头

 [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
    public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute, IOperationBehavior
    {
        public Type TargetContract => throw new NotImplementedException();

        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            return;
        }

        public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
        {
            throw new NotImplementedException();
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
            throw new NotImplementedException();
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {

        }

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

        public void Validate(OperationDescription operationDescription)
        {
            throw new NotImplementedException();
        }
    }
我们将ClientMessageLogger添加到客户端的行为中

    [CustContractBehavior]
    public interface IService
    {...}

最后,我们将此行为添加到服务的接口。

在客户端,我们可以通过IClientMessageInspector修改标头,下面是一个演示:

   public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        { 
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            HttpRequestMessageProperty header;
            if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name))
            {
                header = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
            }
            else
            {
                header = new HttpRequestMessageProperty();
                request.Properties.Add(HttpRequestMessageProperty.Name, header);
            }

            header.Headers["Host"] = "localhost";
            return null;
        }
    }
ClientMessageLogger实现IClientMessageInspector接口,我在客户端发布请求之前修改其请求头

 [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
    public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute, IOperationBehavior
    {
        public Type TargetContract => throw new NotImplementedException();

        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            return;
        }

        public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
        {
            throw new NotImplementedException();
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
            throw new NotImplementedException();
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {

        }

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

        public void Validate(OperationDescription operationDescription)
        {
            throw new NotImplementedException();
        }
    }
我们将ClientMessageLogger添加到客户端的行为中

    [CustContractBehavior]
    public interface IService
    {...}

最后,我们将此行为添加到服务接口。

这对我不起作用,当请求实际发送时,主机头仍然相同。这对我不起作用,当请求实际发送时,主机头仍然相同。