gpt4 book ai didi

用于压缩的 WCF 自定义绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 16:01:15 28 4
gpt4 key购买 nike

按照 compression 的示例由微软。我已将编码器、编码器工厂和绑定(bind)元素添加到我的解决方案中。与他们的示例不同的是,我们不通过配置文件(要求)注册我们的端点,而是使用自定义服务主机工厂。

服务主机:

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);

if (host.Description.Endpoints.Count == 0)
{
host.AddDefaultEndpoints();
}

host.Description.Behaviors.Add(new MessagingErrorHandler());

return host;
}

所以我尝试的是将自定义绑定(bind)添加到我的端点,但是要使用绑定(bind)注册该端点看起来我必须使用 AddServiceEndpoint 但这将需要一个接口(interface),它是未知。我知道我可以获得 serviceType 实现的所有接口(interface)并执行 getInterfaces()[0],但这对我来说似乎是一种不安全的方法。那么有没有办法在不知道接口(interface)的情况下使用自定义绑定(bind)注册我的端点,或者我应该采用更好的方法。

我尝试添加自定义绑定(bind):

CustomBinding compression = new CustomBinding();
compression.Elements.Add(new GZipMessageEncodingBindingElement());
foreach (var uri in baseAddresses)
{
host.AddServiceEndpoint(serviceType, compression, uri);//service type is not the interface and is causing the issue
}

最佳答案

您的自定义绑定(bind)需要一个传输绑定(bind)元素;目前你只有一个消息编码绑定(bind)元素。您可能还需要将 HttpTransportBindingElement 添加到您的自定义绑定(bind)中:

CustomBinding compression = new CustomBinding(
new GZipMessageEncodingBindingElement()
new HttpTransportBindingElement());

就从服务类型中查找接口(interface)而言,没有内置逻辑。 WebServiceHostFactory 中使用的逻辑类似于下面显示的逻辑(此代码深入 1 个继承/实现级别,但理论上您也可以更深入。

    private Type GetContractType(Type serviceType) 
{
if (HasServiceContract(serviceType))
{
return serviceType;
}

Type[] possibleContractTypes = serviceType.GetInterfaces()
.Where(i => HasServiceContract(i))
.ToArray();

switch (possibleContractTypes.Length)
{
case 0:
throw new InvalidOperationException("Service type " + serviceType.FullName + " does not implement any interface decorated with the ServiceContractAttribute.");
case 1:
return possibleContractTypes[0];
default:
throw new InvalidOperationException("Service type " + serviceType.FullName + " implements multiple interfaces decorated with the ServiceContractAttribute, not supported by this factory.");
}
}

private static bool HasServiceContract(Type type)
{
return Attribute.IsDefined(type, typeof(ServiceContractAttribute), false);
}

关于用于压缩的 WCF 自定义绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10642600/

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