gpt4 book ai didi

WCF - 如何使用 HTTP(S) 上的二进制编码以编程方式创建自定义绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 14:52:47 27 4
gpt4 key购买 nike

我想将我当前的 HTTP/HTTPS WCF 绑定(bind)设置转换为使用二进制消息编码,我需要在代码中进行,而不是在 XML 配置中。 AFAIK 有必要创建 CustomBinding 对象并设置正确的 BindingElements,但我无法弄清楚在我的场景中应该使用哪些元素。

我的 WCF 配置中的要点是:

  • 根据配置使用 HTTP 或 HTTPS 传输(在 app.config 中)
  • 使用用户名消息安全
  • todo: 添加二进制编码而不是默认文本

  • 我当前用于设置绑定(bind)的代码(工作,但没有二进制编码):
    var isHttps = Settings.Default.wcfServiceBaseAddress.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase);
    var binding = new WSHttpBinding(isHttps ? SecurityMode.TransportWithMessageCredential : SecurityMode.Message);
    binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

    我正在尝试此代码,但它不起作用 - 我不知道如何为用户名消息安全设置消息安全元素:
    var custBinding = new CustomBinding();
    custBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
    //Transport Security (Not Required)
    if (isHttps)
    {
    custBinding.Elements.Add(SecurityBindingElement.CreateUserNameForSslBindingElement());
    }
    //Transport (Required)
    custBinding.Elements.Add(isHttps ?
    new HttpsTransportBindingElement() :
    new HttpTransportBindingElement());

    有人知道如何设置吗?我试图搜索类似的问题/解决方案,但没有成功......

    最佳答案

    我几乎忘记了这个问题,但这是我的自定义绑定(bind)类,它与 HTTP 上的二进制绑定(bind)以及用户名+密码验证一起使用,并且还允许打开 GZip 压缩...

        public class CustomHttpBinding: CustomBinding
    {
    private readonly bool useHttps;
    private readonly bool useBinaryEncoding;
    private readonly bool useCompression;
    private readonly HttpTransportBindingElement transport;

    public CustomHttpBinding(bool useHttps, bool binaryEncoding = true, bool compressMessages = false)
    {
    this.useHttps = useHttps;
    transport = useHttps ? new HttpsTransportBindingElement() : new HttpTransportBindingElement();
    useBinaryEncoding = binaryEncoding;
    useCompression = compressMessages;
    }

    public long MaxMessageSize{set
    {
    transport.MaxReceivedMessageSize = value;
    transport.MaxBufferSize = (int) value;
    }}

    public override BindingElementCollection CreateBindingElements()
    {
    BindingElement security;
    if (useHttps)
    {
    security = SecurityBindingElement.CreateSecureConversationBindingElement(
    SecurityBindingElement.CreateUserNameOverTransportBindingElement());
    }
    else
    {
    security = SecurityBindingElement.CreateSecureConversationBindingElement(
    SecurityBindingElement.CreateUserNameForSslBindingElement(true));
    }

    MessageEncodingBindingElement encoding;
    if (useCompression)
    {
    encoding = new GZipMessageEncodingBindingElement(useBinaryEncoding
    ? (MessageEncodingBindingElement)
    new BinaryMessageEncodingBindingElement()
    : new TextMessageEncodingBindingElement());
    }
    else
    {
    encoding = useBinaryEncoding
    ? (MessageEncodingBindingElement) new BinaryMessageEncodingBindingElement()
    : new TextMessageEncodingBindingElement();
    }

    return new BindingElementCollection(new[]
    {
    security,
    encoding,
    transport,
    });
    }
    }

    关于WCF - 如何使用 HTTP(S) 上的二进制编码以编程方式创建自定义绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2235931/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com