C# 更改WSDL中生成的服务引用调用的HTTP主机头
我的计算机中有一个指向本地端点的WSDL链接。我已经生成了服务引用,当我在本地执行时,可以很好地访问所有内容。http://localhost/ApplicationHost/EndPoint 如果我使用另一台计算机(在网络中),请求将通过IP即H完成ttp://15.5.20.10/ApplicationHost/EndPoint 但这将响应400个错误请求 将请求的主机更改为“localhost”(在firefox和android上测试)效果良好 图像具有完美的功能案例。该地址具有IP,主机为“localhost”,但我无法在c#中复制此地址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,主
如何使用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
{...}
最后,我们将此行为添加到服务接口。这对我不起作用,当请求实际发送时,主机头仍然相同。这对我不起作用,当请求实际发送时,主机头仍然相同。