2012-04-19 8 views
7

Bir WCF istemcisine eklemek istediğim bir WCF davranış uzantım var. Ancak, istemci programsal olarak yapılandırılmıştır. Bitiş noktası adresi değişebilir, ancak türünü biliyorum. Davranışları programsal olarak veya yapılandırma dosyasında (tercih edilen) ekleyebilirim, ancak yalnızca yapılandırma dosyasında bazı yapılandırmaları geçmem gerekiyor.Programlı olarak oluşturulan bitiş noktasında WCF davranış uzantısını bildirimsel olarak yapılandırın

Bunu Ortak davranışlarda istemiyorum (machine.config).

Ben davranışı programlı

endpoint.Behaviors.Add(new MyCustomBehavior()) 

ekleyebilir Ama doğrusu config de yapardım, bu yüzden de orada uzantısı yapılandırabilirsiniz.

İstemci son noktasını programlı olarak oluştururken, yalnızca tür veya arabirimi bilerek programlı olarak oluşturulmuş bir son noktaya bir uç nokta davranış uzantısını deklaratif olarak eklemek ve yapılandırmak mümkün mü?

<system.serviceModel> 
    <client> 
    <!-- Created programmatically --> 
    </client> 
<extensions> 
    <behaviorExtensions> 
    <add name="MyCustomBehavior" type="namespace.CustomBehaviors", MyAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="MyCustomBehavior"> 
     <MyCustomBehavior MyImportantBehaviorParam1="foo" /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

Elbette başka bölümde yapılandırma koymak ve orada okumak benim davranış var ama mümkünse ben daha çok WCF imkanları kullanmayı tercih ediyorum başladı.

cevap

10

Bunu yapmak için uç noktanız için bir davranış yapılandırma uzantısı oluşturmanız gerekir. Bunun nasıl yapılacağı hakkında daha fazla bilgi için, http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/28/wcf-extensibility-behavior-configuration-extensions.aspx'u işaretleyin.

Güncelleştirme: Sorununuzu şimdi görüyorum. Kodda oluşturulmuş bir son noktaya, yapılandırmada bildirilen bir davranış eklemek için doğrudan bir yol yoktur. Yine de bunu yapabilirsiniz, ancak davranışla ilgili uzantıyı (yöntem korunur) CreateBehavior yöntemine erişmek için, yansıtma davranışını kodla oluşturulan uç noktaya gerçekten eklemek üzere gerçek bir yansıma oluşturmak için bazı yansıma kullanmanız gerekir. Aşağıdaki kod, bunun nasıl yapılabileceğini gösterir.

public class StackOverflow_10232385 
{ 
    public class MyCustomBehavior : IEndpointBehavior 
    { 
     public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
     { 
      Console.WriteLine("In {0}.{1}", this.GetType().Name, MethodBase.GetCurrentMethod().Name); 
     } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
     { 
      Console.WriteLine("In {0}.{1}", this.GetType().Name, MethodBase.GetCurrentMethod().Name); 
     } 

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
     { 
      Console.WriteLine("In {0}.{1}", this.GetType().Name, MethodBase.GetCurrentMethod().Name); 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 
      Console.WriteLine("In {0}.{1}", this.GetType().Name, MethodBase.GetCurrentMethod().Name); 
     } 
    } 

    public class MyCustomBehaviorExtension : BehaviorExtensionElement 
    { 
     public override Type BehaviorType 
     { 
      get { return typeof(MyCustomBehavior); } 
     } 

     protected override object CreateBehavior() 
     { 
      return new MyCustomBehavior(); 
     } 
    } 

    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string text); 
    } 
    public class Service : ITest 
    { 
     public string Echo(string text) 
     { 
      return text; 
     } 
    } 

    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 

     var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     ServiceModelSectionGroup smsg = configuration.GetSectionGroup("system.serviceModel") as ServiceModelSectionGroup; 
     EndpointBehaviorElement endpointBehaviorElement = smsg.Behaviors.EndpointBehaviors["MyCustomBehavior_10232385"]; 
     foreach (BehaviorExtensionElement behaviorElement in endpointBehaviorElement) 
     { 
      MethodInfo createBehaviorMethod = behaviorElement.GetType().GetMethod("CreateBehavior", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Type.EmptyTypes, null); 
      IEndpointBehavior behavior = createBehaviorMethod.Invoke(behaviorElement, new object[0]) as IEndpointBehavior; 
      endpoint.Behaviors.Add(behavior); 
     } 

     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress)); 
     ITest proxy = factory.CreateChannel(); 
     Console.WriteLine(proxy.Echo("Hello")); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 

Ve bu kodu için yapılandırma:

<system.serviceModel> 
    <extensions> 
     <behaviorExtensions> 
      <add name="myCustomBehavior_10232385" type="QuickCode1.StackOverflow_10232385+MyCustomBehaviorExtension, QuickCode1"/> 
     </behaviorExtensions> 
    </extensions> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="MyCustomBehavior_10232385"> 
       <myCustomBehavior_10232385/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

Davranışım zaten Davranış Uzantısı, parametreyi dikkate uygular ... Üzgünüm benim sorum net, ancak tüm içinde olmazsa bulabildiğim örnekler, behaviotik olarak oluşturulmuş bir son noktaya (service veya client) behaviorConfiguration eklenir. Programatik olarak oluşturulan belirli bir sözleşme ile uç noktalara nasıl ekleneceğini bilmem gerekiyor. – DanO

+0

Anladım, daha önce anlamadım. Cevabı bu ile güncelledim ve tam kodu https://github.com/carlosfigueira/WCFQuickSamples/tree/master/WCFForums/QuickCode1 adresinde bulabilirsiniz. – carlosfigueira

+0

Bu geçici çözümü sağlamak için çaba sarf ettiğiniz için teşekkürler! Ben daha kolay olanı lehine istediğimi yapmaktan vazgeçtim, ama bu projeyi tekrar ziyaret edersem kodunuz çok yardımcı olacak! – DanO

İlgili konular