如何从Silverlight中的WCF服务响应中获取自定义SOAP标头?

时间:2011-03-23 13:33:09

标签: silverlight wcf header

我正在尝试在Silverlight应用程序中获取自定义响应消息标题。

在服务器端新的MessageHeader添加到响应头:

OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("headerName", "headerNS", "The header value"));

我可以在Fiddler看到这个标题:

  

s:信封[   的xmlns:S = HTTP://schemas.xmlsoap.org/soap/envelope/   ]

     

S:头

     

headerName [xmlns = headerNS]   标题值

但是,我找不到在Silverlight应用程序服务回调中读取标头值的方法:

            using (new OperationContextScope(proxy.InnerChannel))
            {
                var headers = OperationContext.Current.IncomingMessageHeaders;
                // headers is null :(

            }

是否有人遇到类似问题?

2 个答案:

答案 0 :(得分:1)

在Silverlight上的响应中获取SOAP标头并不像应该的那样容易。如果你使用基于事件的回调,那你就不走运了 - 它只是不起作用。您需要使用Begin / End样式的操作调用,如下例所示。

void Button_Click(...)
{
   MyClient client = new MyClient();
   IClient proxy = (IClient)client; // need to cast to the [ServiceContract] interface
   proxy.BeginOperation("hello", delegate(IAsyncResult asyncResult)
   {
      using (new OperationContextScope(client.InnerChannel))
      {
         proxy.EndOperation(asyncResult);
         var headers = OperationContext.Current.IncomingMessageHeaders;
         // now you can access it.
      }
   });
}

请注意,您无法直接使用生成的客户端(来自slsvcutil / add服务引用),您需要将其强制转换为接口,因为Begin / End方法不会在客户端类上公开(显式实现)。

答案 1 :(得分:0)

要从http请求中获取标头,请尝试使用Client HTTP stack

这样做的简单方法是注册前缀,例如:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);