【问题标题】:Need help converting WCF netTcpBinding to CustomBinding需要帮助将 WCF netTcpBinding 转换为 CustomBinding
【发布时间】:2012-02-09 23:05:56
【问题描述】:

我需要帮助将以下 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>

我主要在自定义绑定的安全部分苦苦挣扎,因为我无法理解所有不同的设置。并且似乎所有东西的命名也不同(与 netTcpBinding 参数相比)。

如有必要,我还将提供以下信息:
服务端点通过 serviceBehavior 附加了一个证书。
在我的代码中,我在创建代理时提供了用户名/密码(服务行为在 serviceCredentials 下有 &lt;userNameAuthentication userNamePasswordValidationMode="Windows" /&gt;;对于 netTcpBinding,WCF 配置编辑器显示 ClientCredentialType=Windows,我猜这是默认值) .

更新:

我为我的主要问题找到了一个潜在的解决方案 - 增加 ChannelInitilizationTimeout - 而无需创建 CustomBinding。我会分享这个,以防有人在谷歌搜索时绊倒这个线程......

我所做的是创建一个继承自 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配置编辑器(在左窗格“配置”->高级->扩展->绑定扩展->新建->给一个名字,例如“MyNetTcp”并指向 dll 文件)将我的类添加为绑定的扩展。

之后在 WCF app.config 中只需将 netTcpBinding 替换为 MyNetTcp 即可(共有三个引用;一个在 &lt;service&gt;&lt;endpoint binding="netTcpBinding"&gt;&lt;/endpoint&gt;&lt;/service&gt;; 中,另外两个是 &lt;bindings&gt;&lt;netTcpBinding&gt;&lt;/netTcpBinding&gt;&lt;/bindings&gt; 下的 xml 标签)。

如果有人想对原始问题给出正确答案,我将保留此问题...

【问题讨论】:

  • 不确定为什么任何默认绑定都不能满足您的需求,但我会看看 msdn.microsoft.com/en-us/library/ms731172.aspx 和这个 SOF stackoverflow.com/questions/2235931/…
  • @Bryan - 我需要增加 ChannelInitilizationTimeout 属性,但这只能在 CustomBinding 中完成。 (有时我的客户在打开服务的通道时遇到异常,跟踪显示由于超时(默认 5 秒)发生了套接字初始化异常。我的服务器(win 2003 R2,.net4,四核, 4GB ram)只能处理 30 个客户端超出了我的范围......)如果我能以某种方式在 c# 代码中设置属性,例如。在创建 WCF 服务时,这也会让我满意,但我还没有找到通过代码访问通道绑定的方法(我只能添加新的)。
  • 是的,我很确定您无法通过代码访问该属性。我相信你已经读过这个blogs.msdn.com/b/andreal/archive/2009/12/04/… 和这个msdn.microsoft.com/en-us/library/ms751528.aspx 和这个msdn.microsoft.com/en-us/library/ms731078.aspx
  • @BryanCorazza - 我确实已经读过前两个,第三个我以前没有读过。尽管如此,这些页面对我的问题都没有帮助(CustomBinding 中的 TransportWithMessageCredential 是什么?是 Windows 身份验证 Kerberos 还是 CustomBinding 中的用户名?是否需要更改 CustomBinding 中的其他 50 个设置中的任何一个才能获得相当于我的例子?等...)

标签: wcf


【解决方案1】:

您可以将 netTcpBinding 传入自定义绑定并执行以下操作。 不能保证反射可以跨版本工作。

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

【讨论】:

  • 那个 Find() 方法很有趣。唯一的问题是,我在哪里插入这个代码?我目前看到的唯一选项是在创建 ServiceHost 期间,尽管我必须在代码中定义整个端点+绑定(不能像现在这样使用配置文件),因为只能为一个 ServiceHost...(也许可以继承 ServiceHost 并覆盖一些创建方法,以便根据配置文件常规 netTcpBinding 注入我的 CustomBinding,但我还没有研究过)
  • 我指的是使用反射来更新属性的代码 - 这可能是您可以创建自定义绑定的地方。如果你想要部分配置和部分代码。同样,您也可以使用配置中的 TcpTransportBindingElement 创建自定义绑定。我们在 4.5 btw 中提高了这一点 - msdn.microsoft.com/en-us/library/dd456789%28v=vs.110%29.aspx 此外,为了服务主机的可扩展性,您可以尝试 serviceHostFactory 并覆盖 ApplyConfiguration
  • 不可能在我的代码中使用你的方法(除非可能覆盖某些方法),因为你的方法基本上创建了一个新的绑定或至少是新的绑定元素(例如,我不能在我的类构造函数将我的类重新定义/重新创建为'new CustomBinding()')。我真正喜欢的是所有配置而不是代码,但是由于没有人发布基于配置的答案,我不得不使用我的代码解决方案,我可以将它作为扩展插入到配置文件中。我想我会等待 .net 4.5 才能恢复到 netTcpBinding...
猜你喜欢
  • 2014-05-10
  • 2018-11-24
  • 2019-12-23
  • 2021-11-06
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多