WCF - 如何通过HTTP(S)以二进制编码创建编程自定义绑定

But*_*aur 6 security wcf binding

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

我的WCF配置的要点是:

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

我当前设置绑定的代码(工作,但没有二进制编码):

var isHttps = Settings.Default.wcfServiceBaseAddress.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase);
var binding = new WSHttpBinding(isHttps ? SecurityMode.TransportWithMessageCredential : SecurityMode.Message);
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
Run Code Online (Sandbox Code Playgroud)

我正在尝试此代码,但它不起作用 - 我不知道如何为用户名消息安全设置消息安全元素:

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());
Run Code Online (Sandbox Code Playgroud)

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

But*_*aur 7

我几乎忘记了这个问题,但这里是我的自定义绑定类,它通过HTTP进行二进制绑定,使用用户名+密码验证,并允许打开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,
            });
    }
}
Run Code Online (Sandbox Code Playgroud)