gpt4 book ai didi

c# - 用于在客户端动态添加传出消息属性的 WCF 扩展

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:53 25 4
gpt4 key购买 nike

我正在使用具有多个操作的 WCF 服务,此服务要求我在调用其任何操作时添加传出消息属性。

目前我只是在每次调用代码中的服务时添加属性。

这是我的代码:

using (new OperationContextScope(client.InnerChannel))
{
OperationContext.Current.OutgoingMessageProperties.Add("P1", "Test User");
OperationContext.Current.OutgoingMessageProperties.Add("P2", "Test Type");
response = client.process(request);
}

如何创建动态添加这些消息属性的 WCF 扩展?

我对扩展知之甚少,但不足以拦截和添加这些 header 。

最佳答案

要自动向邮件添加一些 header ,您必须实现 IClientMessageInspector 。它允许您更改外发消息的任何内容。

编辑 2:

public class ClientMessageInspector : IClientMessageInspector
{
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
//following example is for adding http header.
//If you have another protocol you can add any other message
//manipulation code instead.

//HttpResponseMessageProperty.Name returns "httpResponse".

HttpResponseMessageProperty httpProp = null;
if (request.Properties.ContainsKey(HttpResponseMessageProperty.Name))
{
httpProp = (HttpResponseMessageProperty)request.Properties[HttpResponseMessageProperty.Name];
}
else
{
httpProp = new HttpResponseMessageProperty();
request.Properties.Add(HttpResponseMessageProperty.Name, httpProp);
}

httpProp.Headers.Add("YouHeader", "YourValue");

//as I mentioned you can change a message in a way you need
request.Properties.Add("P1", "Test User");
request.Headers.Add(MessageHeader.CreateHeader("P1", "htt p://site.com/", "Test User"));

return null;
}

public void AfterReceiveReply(ref Message reply, object correlationState) { }
}

public class ClientMessageInspectorBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}

public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(new ClientMessageInspector());
}

public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{

}

public void Validate(ServiceEndpoint endpoint)
{
}
}

public class ClientMessageInspectorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ClientMessageInspectorBehavior();
}

public override Type BehaviorType
{
get
{
return typeof(ClientMessageInspectorBehavior);
}
}
}

你的配置文件应该是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.serviceModel>
<client>
<endpoint
address="http://localhost:8000/CoolerService"
behaviorConfiguration="coolerBehaviour"
binding="webHttpBinding"
contract="CoolerService.ICoolerService"
name="coolerEndpoint">
</endpoint>
</client>

<extensions>
<behaviorExtensions>
<add name="customHeaderAdder" type="Extensions.ClientMessageInspectorExtensionElement, Extensions" />
</behaviorExtensions>
</extensions>

<behaviors>
<endpointBehaviors>
<behavior name="coolerBehaviour">
<customHeaderAdder />
</behavior>
</endpointBehaviors>
</behaviors>

</system.serviceModel>

</configuration>

关于c# - 用于在客户端动态添加传出消息属性的 WCF 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com