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

问题描述

| 我正在尝试在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 :(

            }
是否有人遇到类似问题?     

解决方法

在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 /添加服务引用),您需要将其强制转换为接口,因为Begin / End方法没有在客户端类上公开(明确实现)。     ,要从http请求获取标头,请尝试使用客户端HTTP堆栈。 简便的方法是注册前缀,例如:
WebRequest.RegisterPrefix(\"http://\",WebRequestCreator.ClientHttp);