近几天考虑为webservice加密,发现SoapMessage的Action很不可靠。

Code
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize://这时message.Action有值
break;
case SoapMessageStage.AfterSerialize://
break;
case SoapMessageStage.BeforeDeserialize://服务端取message.Action会抛出异常,客户端却能取出
break;
case SoapMessageStage.AfterDeserialize:
break;
}
}
苦苦查找的过程终于感觉到WCF的好处,当然转换可行性似乎没有。跟踪代码发现Request.Headers有SOAPAction可用。
case SoapMessageStage.BeforeDeserialize:
//this.actionName = message.Action;//客户端可以取出
string actionName = (string)HttpContext.Current.Request.Headers["SOAPAction"].Trim('"');
我希望整个扩展类都能随时用上Action,于是我把取Action写在了初始化的两个方法里。

Code
public override object GetInitializer(Type t)
{
string strType = t.ToString();
if (strType.LastIndexOf("ConnectService") >= 0)
this.IsEncrypt = false;
else
this.IsEncrypt = true;
if(HttpContext.Current!=null)
this.actionName = (string)HttpContext.Current.Request.Headers["SOAPAction"].Trim('"');
return this;
}
public override void Initialize(object initializer)
{
ConnectEncryption connect = initializer as ConnectEncryption;
if (connect != null)
{
this.IsEncrypt = connect.IsEncrypt;
this.target = connect.target;
this.actionName = connect.actionName;
}
}
为什么是两个,说是在每个请求时第一个方法[GetInitializer(Type t)]只会执行一次,但我们的SoapExtension扩展类会被多次构造(跟踪代码看起码两次),每构造一次都会执行第二个方法[Initialize(object initializer)],并把第一个方法返回的object作为第二个方法的参数[initializer]。上面代码的扩展类是ConnectEncryption,继承自 SoapExtension。