C# 将web服务配置转换为代码

C# 将web服务配置转换为代码,c#,xml,web-services,wcf,.net-3.5,C#,Xml,Web Services,Wcf,.net 3.5,我在控制台应用程序中有一个用于SOAP服务的客户端,我需要将服务客户端移动到sharepoint 2010。我不想做配置文件部署和其他sharepoint相关的事情,所以我决定硬编码绑定信息,唯一可配置的选项是URL。但我在做这件事时遇到了一些麻烦。我有一个配置: <system.serviceModel> <bindings> <customBinding> <binding name="SI_PMProjectMaintain_S

我在控制台应用程序中有一个用于SOAP服务的客户端,我需要将服务客户端移动到sharepoint 2010。我不想做配置文件部署和其他sharepoint相关的事情,所以我决定硬编码绑定信息,唯一可配置的选项是URL。但我在做这件事时遇到了一些麻烦。我有一个配置:

    <system.serviceModel>
<bindings>
  <customBinding>
    <binding name="SI_PMProjectMaintain_SOUTBinding">
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
        messageVersion="Soap11" writeEncoding="utf-8">
        <readerQuotas maxDepth="10000000" maxStringContentLength="10000000"
          maxArrayLength="67108864" maxBytesPerRead="65536" maxNameTableCharCount="100000" />
      </textMessageEncoding>
      <httpTransport authenticationScheme="Basic" bypassProxyOnLocal="false"
        hostNameComparisonMode="StrongWildcard" keepAliveEnabled="false"
        proxyAuthenticationScheme="Basic" realm="XISOAPApps" useDefaultWebProxy="true" />
    </binding>
  </customBinding>
</bindings>
<client>
  <endpoint address="http://url/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=Param1&amp;receiverParty=&amp;receiverService=&amp;interface=interface&amp;interfaceNamespace=url"
    binding="customBinding" bindingConfiguration="SI_PMProjectMaintain_SOUTBinding"
    contract="PmProjectMaintain.SI_PMProjectMaintain_SOUT" name="HTTP_Port" />
</client>
它按预期工作。现在,我想摆脱xml配置并将其完全移动到代码:

public class CustomHttpTransportBinding : CustomBinding
{
    public CustomHttpTransportBinding()
    {
    }

    public override BindingElementCollection CreateBindingElements()
    {
        var result = new BindingElementCollection();
        result.Add(new TextMessageEncodingBindingElement
        {
            MaxReadPoolSize = 64,
            MaxWritePoolSize = 16,
            MessageVersion = MessageVersion.Soap11,
            WriteEncoding = Encoding.UTF8,

            //ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas
            //{
            //    MaxDepth = 10000000,
            //    MaxStringContentLength = 10000000,
            //    MaxArrayLength = 67108864,
            //    MaxBytesPerRead = 65536,
            //    MaxNameTableCharCount = 100000
            //}
        });

        result.Add(new HttpTransportBindingElement
        {
            AuthenticationScheme = AuthenticationSchemes.Basic,
            BypassProxyOnLocal = false,
            HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard,
            KeepAliveEnabled = false,
            ProxyAuthenticationScheme = AuthenticationSchemes.Basic,
            Realm = "XISOAPApps",
            UseDefaultWebProxy = true
        });

        return result;
    }
}
我是这样用的:

    var service = new ServiceClient(new CustomHttpTransportBinding(), new EndpointAddress(url));
    service.ClientCredentials.Windows.ClientCredential = new NetworkCredential("user", "password");
    service.ClientCredentials.UserName.UserName = "user";
    service.ClientCredentials.UserName.Password = "password";

    var resp = service.Operation();
    Console.WriteLine(resp.Response);
它到达服务器,但抛出异常(“服务器错误”),因此我认为我的配置有问题。我也不能指定读卡器配额。我尝试过加载,但它不适合我,同样的错误。 证实
似乎我无法将自定义绑定从XML转换为.NET3.5中的代码。有人能看看我的密码并确认一下吗?有没有其他方法可以让服务客户机在代码中具有自定义绑定

我还没有找到将配置从app.config移动到自定义绑定代码的方法,它对basicHttpBinding非常有效,但对customBinding不起作用

最后,我使用定制Channell工厂从文件中加载了配置Dynamicly

public class CustomChannelFactory<T> : ChannelFactory<T>
{
    private readonly string _configurationPath;

    public CustomChannelFactory(string configurationPath) : base(typeof(T))
    {
        _configurationPath = configurationPath;
        base.InitializeEndpoint((string)null, null);
    }

    protected override ServiceEndpoint CreateDescription()
    {
        ServiceEndpoint serviceEndpoint = base.CreateDescription();

        ExeConfigurationFileMap executionFileMap = new ExeConfigurationFileMap();
        executionFileMap.ExeConfigFilename = _configurationPath;

        System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(executionFileMap, ConfigurationUserLevel.None);
        ServiceModelSectionGroup serviceModeGroup = ServiceModelSectionGroup.GetSectionGroup(config);

        ChannelEndpointElement selectedEndpoint = null;
        foreach (ChannelEndpointElement endpoint in serviceModeGroup.Client.Endpoints)
        {
            if (endpoint.Contract == serviceEndpoint.Contract.ConfigurationName)
            {
                selectedEndpoint = endpoint;
                break;
            }
        }

        if (selectedEndpoint != null)
        {
            if (serviceEndpoint.Binding == null)
            {
                serviceEndpoint.Binding = CreateBinding(selectedEndpoint.Binding, serviceModeGroup);
            }

            if (serviceEndpoint.Address == null)
            {
                serviceEndpoint.Address = new EndpointAddress(selectedEndpoint.Address, GetIdentity(selectedEndpoint.Identity), selectedEndpoint.Headers.Headers);
            }

            if (serviceEndpoint.Behaviors.Count == 0 && !String.IsNullOrEmpty(selectedEndpoint.BehaviorConfiguration))
            {
                AddBehaviors(selectedEndpoint.BehaviorConfiguration, serviceEndpoint, serviceModeGroup);
            }

            serviceEndpoint.Name = selectedEndpoint.Contract;
        }

        return serviceEndpoint;
    }

    private Binding CreateBinding(string bindingName, ServiceModelSectionGroup group)
    {
        BindingCollectionElement bindingElementCollection = group.Bindings[bindingName];
        if (bindingElementCollection.ConfiguredBindings.Count > 0)
        {
            IBindingConfigurationElement be = bindingElementCollection.ConfiguredBindings[0];

            Binding binding = GetBinding(be);
            if (be != null)
            {
                be.ApplyConfiguration(binding);
            }

            return binding;
        }

        return null;
    }

    private void AddBehaviors(string behaviorConfiguration, ServiceEndpoint serviceEndpoint, ServiceModelSectionGroup group)
    {
        EndpointBehaviorElement behaviorElement = group.Behaviors.EndpointBehaviors[behaviorConfiguration];
        for (int i = 0; i < behaviorElement.Count; i++)
        {
            BehaviorExtensionElement behaviorExtension = behaviorElement[i];
            object extension = behaviorExtension.GetType().InvokeMember("CreateBehavior",
            BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
            null, behaviorExtension, null);
            if (extension != null)
            {
                serviceEndpoint.Behaviors.Add((IEndpointBehavior)extension);
            }
        }
    }

    private EndpointIdentity GetIdentity(IdentityElement element)
    {
        EndpointIdentity identity = null;
        PropertyInformationCollection properties = element.ElementInformation.Properties;
        if (properties["userPrincipalName"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateUpnIdentity(element.UserPrincipalName.Value);
        }
        if (properties["servicePrincipalName"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateSpnIdentity(element.ServicePrincipalName.Value);
        }
        if (properties["dns"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateDnsIdentity(element.Dns.Value);
        }
        if (properties["rsa"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateRsaIdentity(element.Rsa.Value);
        }
        if (properties["certificate"].ValueOrigin != PropertyValueOrigin.Default)
        {
            X509Certificate2Collection supportingCertificates = new X509Certificate2Collection();
            supportingCertificates.Import(Convert.FromBase64String(element.Certificate.EncodedValue));
            if (supportingCertificates.Count == 0)
            {
                throw new InvalidOperationException("UnableToLoadCertificateIdentity");
            }
            X509Certificate2 primaryCertificate = supportingCertificates[0];
            supportingCertificates.RemoveAt(0);
            return EndpointIdentity.CreateX509CertificateIdentity(primaryCertificate, supportingCertificates);
        }

        return identity;
    }

    private Binding GetBinding(IBindingConfigurationElement configurationElement)
    {
        if (configurationElement is CustomBindingElement)
            return new CustomBinding();
        else if (configurationElement is BasicHttpBindingElement)
            return new BasicHttpBinding();
        else if (configurationElement is NetMsmqBindingElement)
            return new NetMsmqBinding();
        else if (configurationElement is NetNamedPipeBindingElement)
            return new NetNamedPipeBinding();
        else if (configurationElement is NetPeerTcpBindingElement)
            return new NetPeerTcpBinding();
        else if (configurationElement is NetTcpBindingElement)
            return new NetTcpBinding();
        else if (configurationElement is WSDualHttpBindingElement)
            return new WSDualHttpBinding();
        else if (configurationElement is WSHttpBindingElement)
            return new WSHttpBinding();
        else if (configurationElement is WSFederationHttpBindingElement)
            return new WSFederationHttpBinding();

        return null;
    }
}
公共类CustomChannelFactory:ChannelFactory
{
私有只读字符串\u配置路径;
公共CustomChannelFactory(字符串配置路径):基本(类型(T))
{
_configurationPath=configurationPath;
base.InitializeEndpoint((字符串)null,null);
}
受保护的覆盖ServiceEndpoint CreateDescription()
{
ServiceEndpoint ServiceEndpoint=base.CreateDescription();
ExecutionConfigurationFileMap executionFileMap=新的ExecutionConfigurationFileMap();
executionFileMap.ExecutionFileName=\u配置路径;
System.Configuration.Configuration config=ConfigurationManager.OpenMappedExeConfiguration(executionFileMap,ConfigurationUserLevel.None);
ServiceModelSectionGroup serviceModeGroup=ServiceModelSectionGroup.GetSectionGroup(配置);
ChannelEndpointElement selectedEndpoint=null;
foreach(serviceModeGroup.Client.Endpoints中的ChannelEndpointElement端点)
{
if(endpoint.Contract==serviceEndpoint.Contract.ConfigurationName)
{
selectedEndpoint=端点;
打破
}
}
如果(selectedEndpoint!=null)
{
if(serviceEndpoint.Binding==null)
{
serviceEndpoint.Binding=CreateBinding(selectedEndpoint.Binding,serviceModeGroup);
}
if(serviceEndpoint.Address==null)
{
serviceEndpoint.Address=新端点地址(selectedEndpoint.Address、GetIdentity(selectedEndpoint.Identity)、selectedEndpoint.Headers.Headers);
}
if(serviceEndpoint.Behaviors.Count==0&&!String.IsNullOrEmpty(selectedEndpoint.BehaviorConfiguration))
{
添加行为(selectedEndpoint.BehaviorConfiguration、serviceEndpoint、serviceModeGroup);
}
serviceEndpoint.Name=selectedEndpoint.Contract;
}
返回serviceEndpoint;
}
私有绑定CreateBinding(字符串bindingName,ServiceModelSectionGroup组)
{
BindingCollectionElement bindingElementCollection=group.Bindings[bindingName];
如果(bindingElementCollection.ConfiguredBindings.Count>0)
{
IBindingConfigurationElement be=bindingElementCollection.ConfiguredBindings[0];
Binding=GetBinding(be);
如果(be!=null)
{
be.应用配置(绑定);
}
返回绑定;
}
返回null;
}
私有void AddBehaviors(字符串行为配置、ServiceEndpoint ServiceEndpoint、ServiceModelSectionGroup组)
{
EndpointBehaviorElement behaviorElement=group.Behaviors.EndpointBehaviors[behaviorConfiguration];
for(int i=0;ipublic class CustomChannelFactory<T> : ChannelFactory<T>
{
    private readonly string _configurationPath;

    public CustomChannelFactory(string configurationPath) : base(typeof(T))
    {
        _configurationPath = configurationPath;
        base.InitializeEndpoint((string)null, null);
    }

    protected override ServiceEndpoint CreateDescription()
    {
        ServiceEndpoint serviceEndpoint = base.CreateDescription();

        ExeConfigurationFileMap executionFileMap = new ExeConfigurationFileMap();
        executionFileMap.ExeConfigFilename = _configurationPath;

        System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(executionFileMap, ConfigurationUserLevel.None);
        ServiceModelSectionGroup serviceModeGroup = ServiceModelSectionGroup.GetSectionGroup(config);

        ChannelEndpointElement selectedEndpoint = null;
        foreach (ChannelEndpointElement endpoint in serviceModeGroup.Client.Endpoints)
        {
            if (endpoint.Contract == serviceEndpoint.Contract.ConfigurationName)
            {
                selectedEndpoint = endpoint;
                break;
            }
        }

        if (selectedEndpoint != null)
        {
            if (serviceEndpoint.Binding == null)
            {
                serviceEndpoint.Binding = CreateBinding(selectedEndpoint.Binding, serviceModeGroup);
            }

            if (serviceEndpoint.Address == null)
            {
                serviceEndpoint.Address = new EndpointAddress(selectedEndpoint.Address, GetIdentity(selectedEndpoint.Identity), selectedEndpoint.Headers.Headers);
            }

            if (serviceEndpoint.Behaviors.Count == 0 && !String.IsNullOrEmpty(selectedEndpoint.BehaviorConfiguration))
            {
                AddBehaviors(selectedEndpoint.BehaviorConfiguration, serviceEndpoint, serviceModeGroup);
            }

            serviceEndpoint.Name = selectedEndpoint.Contract;
        }

        return serviceEndpoint;
    }

    private Binding CreateBinding(string bindingName, ServiceModelSectionGroup group)
    {
        BindingCollectionElement bindingElementCollection = group.Bindings[bindingName];
        if (bindingElementCollection.ConfiguredBindings.Count > 0)
        {
            IBindingConfigurationElement be = bindingElementCollection.ConfiguredBindings[0];

            Binding binding = GetBinding(be);
            if (be != null)
            {
                be.ApplyConfiguration(binding);
            }

            return binding;
        }

        return null;
    }

    private void AddBehaviors(string behaviorConfiguration, ServiceEndpoint serviceEndpoint, ServiceModelSectionGroup group)
    {
        EndpointBehaviorElement behaviorElement = group.Behaviors.EndpointBehaviors[behaviorConfiguration];
        for (int i = 0; i < behaviorElement.Count; i++)
        {
            BehaviorExtensionElement behaviorExtension = behaviorElement[i];
            object extension = behaviorExtension.GetType().InvokeMember("CreateBehavior",
            BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
            null, behaviorExtension, null);
            if (extension != null)
            {
                serviceEndpoint.Behaviors.Add((IEndpointBehavior)extension);
            }
        }
    }

    private EndpointIdentity GetIdentity(IdentityElement element)
    {
        EndpointIdentity identity = null;
        PropertyInformationCollection properties = element.ElementInformation.Properties;
        if (properties["userPrincipalName"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateUpnIdentity(element.UserPrincipalName.Value);
        }
        if (properties["servicePrincipalName"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateSpnIdentity(element.ServicePrincipalName.Value);
        }
        if (properties["dns"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateDnsIdentity(element.Dns.Value);
        }
        if (properties["rsa"].ValueOrigin != PropertyValueOrigin.Default)
        {
            return EndpointIdentity.CreateRsaIdentity(element.Rsa.Value);
        }
        if (properties["certificate"].ValueOrigin != PropertyValueOrigin.Default)
        {
            X509Certificate2Collection supportingCertificates = new X509Certificate2Collection();
            supportingCertificates.Import(Convert.FromBase64String(element.Certificate.EncodedValue));
            if (supportingCertificates.Count == 0)
            {
                throw new InvalidOperationException("UnableToLoadCertificateIdentity");
            }
            X509Certificate2 primaryCertificate = supportingCertificates[0];
            supportingCertificates.RemoveAt(0);
            return EndpointIdentity.CreateX509CertificateIdentity(primaryCertificate, supportingCertificates);
        }

        return identity;
    }

    private Binding GetBinding(IBindingConfigurationElement configurationElement)
    {
        if (configurationElement is CustomBindingElement)
            return new CustomBinding();
        else if (configurationElement is BasicHttpBindingElement)
            return new BasicHttpBinding();
        else if (configurationElement is NetMsmqBindingElement)
            return new NetMsmqBinding();
        else if (configurationElement is NetNamedPipeBindingElement)
            return new NetNamedPipeBinding();
        else if (configurationElement is NetPeerTcpBindingElement)
            return new NetPeerTcpBinding();
        else if (configurationElement is NetTcpBindingElement)
            return new NetTcpBinding();
        else if (configurationElement is WSDualHttpBindingElement)
            return new WSDualHttpBinding();
        else if (configurationElement is WSHttpBindingElement)
            return new WSHttpBinding();
        else if (configurationElement is WSFederationHttpBindingElement)
            return new WSFederationHttpBinding();

        return null;
    }
}
protected override ServiceEndpoint CreateDescription()
{
    ServiceEndpoint description = base.CreateDescription();
    if (CustomisedChannelFactory<TChannel>.ConfigurationPath == null || !System.IO.File.Exists(CustomisedChannelFactory<TChannel>.ConfigurationPath))
        return base.CreateDescription();
    ServiceModelSectionGroup sectionGroup = ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap()
    {
        ExeConfigFilename = CustomisedChannelFactory<TChannel>.ConfigurationPath
    }, ConfigurationUserLevel.None));
    ChannelEndpointElement channelEndpointElement1 = (ChannelEndpointElement)null;
    foreach (ChannelEndpointElement channelEndpointElement2 in (ConfigurationElementCollection)sectionGroup.Client.Endpoints)
    {
        if (channelEndpointElement2.Contract == description.Contract.ConfigurationName)
        {
            channelEndpointElement1 = channelEndpointElement2;
            break;
        }
    }
    if (channelEndpointElement1 != null)
    {
        if (description.Binding == null)
            description.Binding = this.CreateBinding(channelEndpointElement1.Binding, channelEndpointElement1.BindingConfiguration, sectionGroup);
        if (description.Address == (EndpointAddress)null)
            description.Address = new EndpointAddress(channelEndpointElement1.Address, this.GetIdentity(channelEndpointElement1.Identity), channelEndpointElement1.Headers.Headers);
        if (description.Behaviors.Count == 0 && !string.IsNullOrEmpty(channelEndpointElement1.BehaviorConfiguration))
            this.AddBehaviors(channelEndpointElement1.BehaviorConfiguration, description, sectionGroup);
        description.Name = channelEndpointElement1.Contract;
    }
    return description;
}

private Binding CreateBinding(string bindingName, string bindingConfigurationName, ServiceModelSectionGroup group)
{
    BindingCollectionElement collectionElement = group.Bindings[bindingName];
    if (collectionElement.ConfiguredBindings.Count <= 0)
        return (Binding)null;

    IBindingConfigurationElement configurationElement = null;
    foreach (IBindingConfigurationElement bce in collectionElement.ConfiguredBindings)
    {
        if (bce.Name.Equals(bindingConfigurationName))
        {
            configurationElement = bce;
            break;
        }
    }
    if (configurationElement == null) throw new Exception("BindingConfiguration " + bindingConfigurationName + " not found under binding " + bindingName);

    Binding binding = this.GetBinding(configurationElement);
    if (configurationElement != null)
        configurationElement.ApplyConfiguration(binding);
    return binding;
}