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

时间:2010-02-10 10:10:44

标签: wcf security 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;

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

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());

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

3 个答案:

答案 0 :(得分: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,
            });
    }
}

答案 1 :(得分:0)

请尝试SecurityBindingElement.CreateUserNameOverTransportBindingElement()

var custBinding = new CustomBinding();
custBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
//Transport Security (Not Required)
if (isHttps)
{
  custBinding.Elements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement());
}
//Transport (Required)
custBinding.Elements.Add(isHttps ?
   new HttpsTransportBindingElement() :
   new HttpTransportBindingElement());

答案 2 :(得分:0)

SecurityBindingElement具有AllowInsecureTransport属性。如果将此参数设置为true,则可以将HttpTransportBindingElement与消息用户名和密码安全性一起使用。