首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在每个WCF调用中添加一个自定义的HTTP头?

如何在每个WCF调用中添加一个自定义的HTTP头?
EN

Stack Overflow用户
提问于 2009-06-08 11:20:40
回答 14查看 194.6K关注 0票数 170

我有一个驻留在Windows服务中的WCF服务。使用此服务的客户端必须在每次调用服务方法时传递一个标识符(因为该标识符对于被调用方法应该做的事情很重要)。我认为以某种方式将此标识符放入WCF标头信息是一个好主意。

如果这是一个好主意,我如何将标识符自动添加到头部信息中。换句话说,每当用户调用WCF方法时,必须将标识符自动添加到标头中。

WCF更新:使用服务的客户端既是Windows应用程序,也是Windows Mobile应用程序(使用Compact Framework)。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 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。我相信消息检查器被归类为“通道可扩展性”,根据这篇文章,是由紧凑框架支持的。

票数 194
EN

Stack Overflow用户

发布于 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");
票数 81
EN

Stack Overflow用户

发布于 2009-11-06 20:10:47

如果你只是想给服务的所有请求添加相同的头,你可以不需要任何编码就能做到!

只需在客户端配置文件中的端点节点下添加包含所需标头的headers节点

<client>  
  <endpoint address="http://localhost/..." >  
    <headers>  
      <HeaderName>Value</HeaderName>  
    </headers>   
 </endpoint>  
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/964433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档