问题描述
|
我正在尝试在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);