2011-08-12 14 views
7

Bir uç noktanın protobuf-net (V1.0.0.280) davranış uzantısı ile yapılandırıldığı 4 uç noktayı açığa çıkaran bir WCF hizmeti (.NET 4) var. Ancak, protobuf-net davranışı protbuf-net olanlar için de dahil olmak üzere TÜM tanımlanmış uç noktaları için başladığı fark ettim! Aşağıdaki yapılandırmamı yapıştırdım. Bir şey mi eksik? Herhangi bir Yardım büyük thx .. takdir Garip ama sadece hiç içinde yer değişimi WCF tarafından bana verilen bir bitiş noktası uygulamak (kodu kontrol)Son nokta davranış yapılandırması WCF with Protobuf-net

<service name="MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="Http.Basic" binding="basicHttpBinding" bindingConfiguration="Http.Basic.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" /> 
    <endpoint address="Http.Binary" binding="customBinding" bindingConfiguration="Http.Binary.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" /> 
    <endpoint address="Tcp.Binary" binding="customBinding" bindingConfiguration="Tcp.Binary.Config" contract="IMyService" behaviorConfiguration="DefaultBehavior" /> 
    <endpoint address="Http.ProtoBuf" binding="basicHttpBinding" bindingConfiguration="Http.Basic.Config" contract="IMyService" behaviorConfiguration="ProtoBufBehavior" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8085/MyService"/> 
     <add baseAddress="net.tcp://localhost:8086/MyService"/> 
     </baseAddresses> 
    </host> 
    </service> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="DefaultBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     </behavior> 
     <behavior name="ProtoBufBehavior"> 
     <ProtoBufSerialization /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

    <bindings> 
    <basicHttpBinding> 
     <binding name="Http.Basic.Config" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
     </binding> 
    </basicHttpBinding> 
    <customBinding> 
     <binding name="Http.Binary.Config" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"> 
     <binaryMessageEncoding /> 
     <httpTransport allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" /> 
     </binding> 
     <binding name="Tcp.Binary.Config" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"> 
     <binaryMessageEncoding /> 
     <tcpTransport hostNameComparisonMode="StrongWildcard" /> 
     </binding> 
    </customBinding> 
    </bindings> 
+0

Programlanabilir olarak proto-davranışla aynı sorunu yaşıyoruz – Ruslan

cevap

1

:

void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
     ReplaceDataContractSerializerOperationBehavior(endpoint); 
    } 

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
    { 
     ReplaceDataContractSerializerOperationBehavior(endpoint); 
    } 

    private static void ReplaceDataContractSerializerOperationBehavior(ServiceEndpoint serviceEndpoint) 
    { 
     foreach (OperationDescription operationDescription in serviceEndpoint.Contract.Operations) 
     { 
      ReplaceDataContractSerializerOperationBehavior(operationDescription); 
     } 
    } 


    private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description) 
    { 
     DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     if (dcsOperationBehavior != null) 
     { 
      description.Behaviors.Remove(dcsOperationBehavior); 
      description.Behaviors.Add(new ProtoOperationBehavior(description)); 
     } 
    } 

yani " Bu son nokta, her işlem (yöntemi) üzerinde (WCF tarafından) bitiş noktası, döngü verilir ve bu sözleşme d meraklandırıcı ihtimalini ortaya çıkarmaktadır

"PB için kumanda merkezinden seri hale değiştirmek Tüm uç noktalar arasındaki etkiler (ve dolayısıyla işlem tanımları) kendileri paylaşılır - ama bundan kesinlikle emin değilim. Bu , ise, her uç noktasında farklı işlemcilere sahip olmanın mümkün olacağını görmüyorum. Bununla birlikte, bir WCF-guru değilim. Bu şaşkınlık.

+1

Süper hızlı yanıtınız için çok teşekkürler ve ben sizin noktanızı görüyorum. Bu oyunda gerçekten garip bir şey fark ettim, yani, eğer son noktayı konfigürasyondaki son düğüm olarak protobuf davranışı ile tutarsam, herşey beklendiği gibi iyi çalışır .. Ancak, eğer ilk pozisyona taşınırsam, tüm uç noktalar açılır. protobuf. O zaman arasında hareket edersem sonra protobuf alır sonra tanımlanan uç noktaları! Kök nedenini bulursam daha derine iner ve gönderir – Japps

+0

Anladığım gibi, contractDescription uç noktalar arasında paylaşılır. Ancak, proto-behaviuor ile son noktadan sonra tanımlanan uç noktalara (davranışın açıkça yapılandırıldığı son nokta dahil olmak üzere) neden proto-davranışın eklendiğini anlamıyorum. @Japps ile benzer bir çözümü kullanıyoruz: son noktaya ev sahibi ile son nokta olarak son nokta ekleyin – Ruslan

İlgili konular