2

WCF クライアントをインターセプトしようとしています。しかし、Unity インターセプターは機能していないようです。

  1. プロキシへの呼び出しがありません。
  2. アトリビュートをコンテナにリンクする方法がわかりませんでした
  3. AddPolicy の name 属性とは何ですか - ここでは、関数を使用してインターセプト - GetXml を使用しました。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
public class GetXmlCallHandlerAttribute : HandlerAttribute
{
  public GetXmlCallHandlerAttribute(){}
  public override ICallHandler CreateHandler(IUnityContainer ignored)
  {
    return new GetXmlTestCallHandler();
  }
}
public class GetXmlTestCallHandler : ICallHandler
{
  public int Order { get; set; }  
  public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
  {
    IMethodReturn msg;
    Object returnValue = XElement.Load("../../Resources/a1.xml");
    Object[] outputs = null;
    msg = input.CreateMethodReturn(returnValue, outputs);
    return msg;        
  }
} 
class SendDataTest
{
  public void GetXmlTest()
  {
    IUnityContainer container = new UnityContainer();
    ICallHandler myInterception = new GetXmlTestCallHandler();    
    container.AddNewExtension<Interception>();
    container.RegisterType<SendData>(new Interceptor(new TransparentProxyInterceptor()));
    container.Configure<Interception>().AddPolicy("GetXml").AddCallHandler(myInterception);
    SendData target = container.Resolve<SendData>();
    XElement expected = null; // TODO: Initialize to an appropriate value
    XElement actual;
    actual = target.GetXml();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
  }
}
4

1 に答える 1

1

あなたがしなければならないことがいくつかあります: -

SendData を登録するときに InterceptionBehaviour() を追加する必要があります。

    container.RegisterType<SendData>(new InterceptionBehaviour<PolicyInjectionBehaviour>(), new Interceptor(new TransparentProxyInterceptor()));

これは、作成したポリシーに参加することを Unity が認識できるようにするためです。TransparentProxyInterceptor は、実際にインターセプトを実行する方法を示しているだけです。

また、インターセプトする適切なメソッドに属性を適用する必要があります。SendData クラスの GetXml メソッドでそれを行っていると仮定します。

于 2012-10-19T10:05:54.003 に答える