2011-08-12 34 views
7

Tôi có dịch vụ WCF (.NET 4) cho thấy 4 điểm cuối trong đó một điểm cuối được cấu hình với phần mở rộng hành vi protobuf-net (V1.0.0.280). Tuy nhiên, tôi nhận thấy rằng hành vi protobuf-net bắt đầu cho ALL các điểm cuối được xác định bao gồm các điểm cuối của protbuf-net không được định cấu hình! Tôi đã dán cấu hình của mình bên dưới. Tui bỏ lỡ điều gì vậy? Any help is appreciated rất nhiều .. thxCấu hình hành vi điểm cuối WCF với 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

Chúng tôi có cùng một vấn đề với hành vi proto được thêm theo chương trình – Ruslan

Trả lời

1

Đó là kỳ quặc, nhưng (kiểm tra mã) Tôi chỉ từng áp dụng thay đổi trong một thiết bị đầu cuối cung cấp cho tôi bằng cách WCF:

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)); 
     } 
    } 

ie " được một điểm cuối (bởi WCF), lặp lại trên mỗi hoạt động (phương pháp) trong điểm cuối đó và thay đổi bộ nối tiếp từ DCS thành PB "

Điều này làm tăng khả năng hấp dẫn mà hợp đồng d efinitions (và do đó các định nghĩa hoạt động) được chia sẻ giữa tất cả các điểm cuối - nhưng tôi thành thật không chắc chắn về điều đó. Nếu điều đó trường hợp, tôi không thấy rằng nó sẽ có thể có bộ vi xử lý khác nhau cho mỗi điểm cuối. Tôi không phải, tuy nhiên, một WCF-guru. Đây là ... rắc rối.

+1

Cảm ơn rất nhiều vì phản hồi cực nhanh của bạn và tôi thấy quan điểm của bạn. Tôi nhận thấy một cái gì đó thực sự kỳ lạ trong khi chơi xung quanh này, đó là, nếu tôi giữ điểm cuối với hành vi protobuf như nút cuối cùng trong cấu hình sau đó tất cả mọi thứ hoạt động tốt như mong đợi .. Tuy nhiên, nếu tôi di chuyển nó đến vị trí đầu tiên sau đó tất cả các thiết bị đầu cuối nhận protobuf. Nếu tôi di chuyển nó ở giữa thì các điểm cuối được xác định sau khi nó chọn protobuf !! Sẽ đào sâu hơn và đăng nếu tôi tìm nguyên nhân gốc – Japps

+0

Như tôi đã hiểu, contractDescription được chia sẻ giữa các điểm cuối, thực sự. Nhưng tôi không hiểu tại sao proto-behavior chỉ được thêm vào các điểm cuối được xác định sau endpoint với proto-behaviuor (bao gồm endpoint cho hành vi nào được cấu hình một cách rõ ràng). Chúng tôi sử dụng giải pháp tương tự như @Japps: thêm điểm cuối với proto làm điểm cuối cuối cùng cho máy chủ lưu trữ – Ruslan

Các vấn đề liên quan