我有一个驻留在Windows服务中的WCF服务。使用此服务的客户端必须在每次调用服务方法时传递一个标识符(因为该标识符对于被调用方法应该做的事情很重要)。我认为以某种方式将此标识符放入WCF标头信息是一个好主意。
如果这是一个好主意,我如何将标识符自动添加到头部信息中。换句话说,每当用户调用WCF方法时,必须将标识符自动添加到标头中。
WCF更新:使用服务的客户端既是Windows应用程序,也是Windows Mobile应用程序(使用Compact Framework)。
发布于 2009-09-10 23:05:29
这样做的好处是它可以应用于每个调用。
创建一个实现IClientMessageInspector的类。在BeforeSendRequest方法中,将自定义标头添加到传出消息。它可能看起来像这样:
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
HttpRequestMessageProperty httpRequestMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
{
httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
if (string.IsNullOrEmpty(httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER]))
{
httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER] = this.m_userAgent;
}
}
else
{
httpRequestMessage = new HttpRequestMessageProperty();
httpRequestMessage.Headers.Add(USER_AGENT_HTTP_HEADER, this.m_userAgent);
request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
}
return null;
}
然后创建一个端点行为,将消息检查器应用于客户端运行时。您可以通过属性或通过使用行为扩展元素的配置来应用行为。
下面是一个很棒的example,介绍了如何向所有请求消息添加HTTP user-agent头。我在我的几个客户中使用了这个。您也可以通过实现IDispatchMessageInspector在服务端执行相同的操作。
这就是你所想的吗?
WCF:我找到了这个精简框架所支持的特性的list。我相信消息检查器被归类为“通道可扩展性”,根据这篇文章,是由紧凑框架支持的。
发布于 2009-06-08 11:30:51
您可以使用以下命令将其添加到呼叫:
using (OperationContextScope scope = new OperationContextScope((IContextChannel)channel))
{
MessageHeader<string> header = new MessageHeader<string>("secret message");
var untyped = header.GetUntypedHeader("Identity", "http://www.my-website.com");
OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
// now make the WCF call within this using block
}
然后,在服务器端使用以下命令获取数据:
MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
string identity = headers.GetHeader<string>("Identity", "http://www.my-website.com");
发布于 2009-11-06 20:10:47
如果你只是想给服务的所有请求添加相同的头,你可以不需要任何编码就能做到!
只需在客户端配置文件中的端点节点下添加包含所需标头的headers节点
<client>
<endpoint address="http://localhost/..." >
<headers>
<HeaderName>Value</HeaderName>
</headers>
</endpoint>
https://stackoverflow.com/questions/964433
复制相似问题