我在最後一天遇到了這個問題。我已經在MSDN文章和一些博客帖子之後創建了一個SOAP擴展,但我無法讓它工作。好了一些代碼:序列化後SOAP擴展流爲空
public class EncryptionExtension : SoapExtension
{
Stream _stream;
public override object GetInitializer(Type serviceType)
{
return typeof(EncryptionExtension);
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return attribute;
}
public override void Initialize(object initializer)
{
}
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
break;
case SoapMessageStage.BeforeDeserialize:
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public override Stream ChainStream(Stream stream)
{
_stream = stream;
return stream;
}
}
還有一個屬性類:
[AttributeUsage(AttributeTargets.Method)]
public class EncryptionExtensionAttribute : SoapExtensionAttribute
{
public override Type ExtensionType
{
get { return typeof(EncryptionExtension); }
}
public override int Priority
{
get;
set;
}
}
所以當消息進來,我可以看到入站SOAP請求時,我在BeforeDeserialization和AfterDeserialization,這是偉大的調試。然後調用我的Web服務方法。這是簡單的:
[WebMethod()]
[EncryptionExtension]
public string HelloWorld()
{
return "Hello world";
}
該過程然後跳回到我的SoapExtension。在BeforeSerialization和AfterSerialization放置斷點時,我看到出站流不包含任何內容。我並不驚訝它在BeforeSerialization上是空的,但我很驚訝它在AfterSerialization中是空的。這會產生一個問題,因爲我需要獲取出站流,以便對其進行加密。
有人能告訴我爲什麼出站流是空的嗎?我遵循這個MSDN文章,這表明它不應該是http://msdn.microsoft.com/en-us/library/ms972410.aspx。 我是否缺少一些配置或其他內容?
是啊,我注意到,在的SoapExtension類概述文檔的例子似乎是正確的(AFAICT),但描述了整個過程的更完整的文檔違背傳遞和返回ChainStream流的使用。我的測試發現,這個例子有他們的權利,而不是一般的文件。 – 2010-10-14 20:31:10
@Rob,如果您發現文檔錯誤,我希望您將其報告給Microsoft。 – 2010-10-18 18:45:06