私はこの問題を最後の日に受けました。私はSOAP拡張機能をMSDNの記事とブログ投稿の後に作成しましたが、動作させることができません。 [OK]をいくつかのコード: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;
}
}
属性クラスもあります:私はBeforeDeserializationとAfterDeserializationでデバッグするとき、私は偉大である、インバウンドSOAPリクエストを見ることができるで
[AttributeUsage(AttributeTargets.Method)]
public class EncryptionExtensionAttribute : SoapExtensionAttribute
{
public override Type ExtensionType
{
get { return typeof(EncryptionExtension); }
}
public override int Priority
{
get;
set;
}
}
ので、メッセージが来るとき。私のWebサービスメソッドが呼び出されます。単純には次のとおりです。
[WebMethod()]
[EncryptionExtension]
public string HelloWorld()
{
return "Hello world";
}
次に、プロセスがSoapExtensionにホップバックします。 BeforeSerializationとAfterSerializationにブレークポイントを設定すると、アウトバウンドストリームには何も含まれていないことがわかります。私はそれがBeforeSerializationで空であることに驚いていませんが、私はそれがAfterSerializationで空であることに驚いています。これは、私がそれを暗号化できるように、アウトバウンドストリームを保持する必要があるため、問題を引き起こします。
送信ストリームが空である理由を教えてもらえますか?私はそれがhttp://msdn.microsoft.com/en-us/library/ms972410.aspxであってはならないことを示すこのMSDN記事に従っています。 設定などがありませんか?
ええ、私はのSoapExtensionクラスの概要ドキュメントの例では、(AFAICT)正しいように見えますが、全体のプロセスを記述し、より完全なドキュメントがに渡されたストリームの使用法と矛盾してChainStreamによって返されたことに気付きました。私のテストでは、この例は一般的なドキュメントではなく、正しいものであることがわかりました。 –
@Rob、ドキュメントのエラーが見つかった場合は、マイクロソフトに報告していただきたいと思います。 –