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