2012-02-09 2 views
4

Мне нужна помощь преобразования следующий NetTcpBinding к эквивалентной CustomBinding:Нужна помощь преобразования WCF NetTcpBinding в CustomBinding

<bindings> 
    <netTcpBinding> 
     <binding name="secureNetTcp" openTimeout="00:00:25" closeTimeout="00:00:27" receiveTimeout="00:10:10" sendTimeout="00:01:00" 
      listenBacklog="50" maxBufferPoolSize="2097152" maxBufferSize="2097152" maxConnections="50" maxReceivedMessageSize="2097152"> 
      <readerQuotas maxArrayLength="2097152" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" /> 
      <security mode="TransportWithMessageCredential"> 
       <message algorithmSuite="Basic256Sha256" /> 
      </security> 
     </binding> 
    </netTcpBinding> 
</bindings> 

Я в основном struggeling со стороны безопасности обычай связывания, потому что я не могу понять все различные настройки. И все, кажется, именоваться по-другому (по сравнению с параметрами netTcpBinding).

В случае, если это необходимо, я буду предоставлять следующую информацию, а также:
Конечной службы имеет сертификат приложенный к нему через serviceBehavior.
В моем коде я обеспечиваю имя пользователя/пароль, то при создании прокси (поведение службы имеет <userNameAuthentication userNamePasswordValidationMode="Windows" /> под serviceCredentials; Для NetTcpBinding редактор конфигурации WCF показывает ClientCredentialType=Windows, который я думаю, это значение по умолчанию).

Update:

Я нашел потенциальное решение для моей главной задачи - повышение ChannelInitilizationTimeout - без необходимости создания CustomBinding. Я поделюсь этим, упаковывает кто stumbels на эту тему, а googeling ...

То, что я сделал, был создать пользовательский класс, который наследует от NetTcpBinding и в это конструкторе используется отражение для установки ChannelInitilizationTimeout свойства. Таким образом, поддерживая полную совместимость с NetTcpBinding.

Вот код для моего пользовательского класса:

public class MyNetTcpBinding : NetTcpBinding 
{ 
    public MyNetTcpBinding() 
    { 
     var fi = typeof(NetTcpBinding).GetField("transport", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     var val = (System.ServiceModel.Channels.TcpTransportBindingElement)fi.GetValue(this); 
     val.ChannelInitializationTimeout = TimeSpan.FromSeconds(10); 
    } 
} 

public class MyBindingElement : NetTcpBindingElement 
{ 
    protected override Type BindingElementType 
    { 
     get { return typeof(MyNetTcpBinding); } 
    } 
} 

public class MyBindingElementCollection : StandardBindingCollectionElement<MyNetTcpBinding, MyBindingElement> 
{ 
} 

После компиляции этого класса (я создал отдельный DLL проект для этого класса), я использовал редактор конфигурации WCF (под левой панелью «Настройка» -> Дополнительно -> Расширения -> привязки расширений -> new -> укажите имя, например. "MyNetTcp" и укажите файл dll), чтобы добавить мой класс в качестве расширения для привязок.

Затем в WCF App.config просто заменить netTcpBinding с MyNetTcp (есть три ссылки в общей сложности; один в <service><endpoint binding="netTcpBinding"></endpoint></service>; других двух XML-теги под <bindings><netTcpBinding></netTcpBinding></bindings>).

Я оставлю этот вопрос открытым в случае, если кто-то хочет, чтобы дать правильный ответ на первоначальный вопрос ...

+0

Не уверен, почему любой из привязок по умолчанию не будет удовлетворять ваши потребности, но я хотел бы посмотреть на http://msdn.microsoft.com/en-us/library/ms731172.aspx и этого SOF http://stackoverflow.com/questions/2235931/wcf-how-to-create-programatically-custom-binding-with-binary-encoding-over-htt –

+0

@Bryan - Мне нужно увеличить свойство ChannelInitilizationTimeout, но это может только в CustomBinding.(Иногда мои клиенты получают исключение при открытии канала для службы, трассировка показала, что из-за тайм-аута (по умолчанию 5 секунд) произошло исключение инициализации Socket.Почему мой сервер (win 2003 R2, .net4, quad-core, 4GB RAM) не может обрабатывать только 30 клиентов - это вне меня ...) Если бы я мог каким-то образом установить свойство в коде C#, например. при создании службы WCF, которая также меня удовлетворила бы, но я не нашел способ получить доступ к связыванию канала через код (я могу только добавить новое). – Marko

+0

Да, я уверен, что вы не можете получить доступ к этому свойству через код. Я уверен, что вы прочитали это http://blogs.msdn.com/b/andreal/archive/2009/12/04/wcf-nettcpbinding-what-to-do-if-the-socket-did-not -complete-in-the-allotted-timeout-of.aspx и этот http://msdn.microsoft.com/en-us/library/ms751528.aspx и этот http://msdn.microsoft.com/en-us /library/ms731078.aspx. –

ответ

0

Вы можете пройти в NetTcpBinding в пользовательское связывание и сделать следующее. Нет гарантии, что отражение будет работать в разных версиях.

http://blogs.msdn.com/b/sajay/archive/2010/01/29/how-to-create-a-custom-binding-from-a-standardbinding.aspx

+0

Этот метод поиска <>() довольно интересен. Единственная проблема заключается в том, где я могу включить этот код? Единственная опция, которую я вижу в данный момент, - это создание моего ServiceHost, хотя мне нужно было бы определить всю привязку конечной точки + к коду (не могу использовать файл конфигурации, как сейчас), поскольку можно добавлять конечные точки только для ServiceHost ... (возможно, можно подклассифицировать ServiceHost и переопределить некоторые методы создания inorder для ввода моего CustomBinding на основе файлов config, которые являются обычным netTcpBinding, но я не рассматривал это) – Marko

+0

Я имел в виду ваш код, который использует отражение для обновления свойства. Возможно, вы можете создать настраиваемую привязку. Если вам нужен код детали и код детали. Снова вы можете просто создать настраиваемую привязку, а также с помощью TcpTransportBindingElement в config. Мы столкнулись с этим в 4.5 битв - http://msdn.microsoft.com/en-us/library/dd456789%28v=vs.110%29.aspx Также для расширяемости servicehost вы можете попробовать serviceHostFactory и override ApplyConfiguration – Sajay

+0

Невозможно использовать ваш метод с моим кодом (если, возможно, при переопределении какого-либо метода), потому что ваш метод в основном создает новую привязку или, по крайней мере, новые элементы привязки (я не могу, например, в моем конструкторе классов переопределить/воссоздать мой класс как «новый CustomBinding()»). То, что я бы предпочел, это все config и no code, но поскольку никто не опубликовал ответ на основе конфигурации, мне пришлось использовать мое решение для кода, которое я могу подключить к файлу конфигурации в качестве расширения. Думаю, я просто подожду .net 4.5, чтобы вернуться обратно в netTcpBinding ... – Marko

Смежные вопросы