Asp.Net Core 2.0 WCF Client CustomBinding PlatformNotSupportedException: 不支持BuildChannelFactoryCore

问题描述 投票:5回答:1

我需要能够在Asp.Net Core 2.0中使用自定义绑定在客户端发送授权。在Asp.net 4.6.1中可以工作,但在Core 2.2中不能工作。 我正试图连接到我们租户中的Workday公共网络服务。 由于我能够在Asp.Net 4.6.1中工作,所以我在那里完成了我的开发,但我想为将来可能的开发找出这个问题。

我创建了我在代码中使用的自定义绑定,见下文,然而,我总是得到这个错误:完整的消息。

System.PlatformNotSupportedException : TransportSecurityBindingElement.BuildChannelFactoryCore is not supported.

我在Asp.Net Core 2.0 MVC中的实现。

     public async Task<bool> ImportTimeEntryBlockAsync(TimeEntry item)
       {
           bool isValid = true;
           //Create the update object to update the webservice           

           //setup Header
           Workday_Common_HeaderType header = new Workday_Common_HeaderType
           {
               Include_Reference_Descriptors_In_Response = true
           };

           //setup reported time block data from item
           Reported_Time_Block_DataType timeBlockData = new Reported_Time_Block_DataType();

           PopulateTimeBlock(item, ref timeBlockData);
           Reported_Time_Block_DataType[] timeBlocks = new Reported_Time_Block_DataType[1];
           timeBlocks[0] = timeBlockData;

           //setup import reported time block request
           Import_Reported_Time_Blocks_RequestType request = new Import_Reported_Time_Blocks_RequestType
           {
               version = "v29.0",
               Reported_Time_Block_Data = timeBlocks
           };
           Import_Reported_Time_BlocksInput timeBlock = new Import_Reported_Time_BlocksInput(header, request);

           //create client object
           Time_TrackingPortClient timeTracking = new Time_TrackingPortClient();
           timeTracking.ClientCredentials.UserName.UserName = IntegrationUser + @"@" + IntegrationDomain;
           timeTracking.ClientCredentials.UserName.Password = IntegrationPassword;

           SetupCustomBinding(timeTracking);

           //Set endpoint address
           Uri uri = new Uri(WorkdayHost + @"/Time_Tracking/v29.0");
           EndpointAddress endpoint = new EndpointAddress(uri);
           timeTracking.Endpoint.Address = endpoint;

           await timeTracking.OpenAsync();
           var result = await timeTracking.Import_Reported_Time_BlocksAsync(timeBlock);


           if (result == null)
               isValid = false;
           return isValid;
       }

       private static void SetupCustomBinding(Time_TrackingPortClient timeTracking)
       {
           // Create a custom binding that contains two binding elements; Security, Encoding and Transport

           //Security
           TransportSecurityBindingElement transportSecurity = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
           transportSecurity.IncludeTimestamp = true;

           XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas
           {
               MaxArrayLength = int.MaxValue,
               MaxBytesPerRead = int.MaxValue,
               MaxDepth = int.MaxValue,
               MaxNameTableCharCount = int.MaxValue,
               MaxStringContentLength = int.MaxValue
           };
           //encoding
           TextMessageEncodingBindingElement textEncoding = new TextMessageEncodingBindingElement
           {
               MessageVersion = MessageVersion.Soap11,
               ReaderQuotas = readerQuotas
           };

           // transport       
           HttpsTransportBindingElement httpsTransport = new HttpsTransportBindingElement
           {
               AuthenticationScheme = AuthenticationSchemes.Basic,
               MaxBufferSize = int.MaxValue,
               MaxReceivedMessageSize = int.MaxValue,
               TransferMode = TransferMode.Buffered
           };

           SynchronizedCollection<BindingElement> coll = new SynchronizedCollection<BindingElement>
           {
               transportSecurity,
               textEncoding,
               httpsTransport
           };

           //Set Custom Binding
           CustomBinding binding = new CustomBinding(coll);
           timeTracking.Endpoint.Binding = binding;
       }

希望它能给我一个响应,因为我能够在Asp.Net中的web.config设置中使它工作。

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="IntegrationsBinding">
          <security mode="Transport"/>
        </binding>
        <binding name="IntegrationsBinding1"/>
      </basicHttpBinding>
      <customBinding>
        <binding name="WDWebServiceCustomBinding">
          <security authenticationMode="UserNameOverTransport" includeTimestamp="false">
            <secureConversationBootstrap/>
          </security>
          <textMessageEncoding messageVersion="Soap11">
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          </textMessageEncoding>
          <httpsTransport maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" realm=""/>
        </binding>
      </customBinding>
    </bindings>
    <client>
      <endpoint address="https://[webserver]/Time_Tracking/v31.0" binding="customBinding" bindingConfiguration="WDWebServiceCustomBinding" contract="TimeTracking.Time_TrackingPort" name="Time_Tracking"/>
      <endpoint address="https://[webserver]/Integrations/v31.0" binding="customBinding" bindingConfiguration="WDWebServiceCustomBinding" contract="Integration.IntegrationsPort" name="Integrations"/>
      <endpoint address="https://[webserver]/Absence_Management/v31.0" binding="customBinding" bindingConfiguration="WDWebServiceCustomBinding" contract="Absence.Absence_ManagementPort" name="Absence_Management"/>
    </client>
  </system.serviceModel>

我不认为我的实现是错误的,但需要知道我是否遗漏了什么,或者如果BuildChannelFactoryCore仍然不被支持,那么什么时候会被支持?

参考博客中提到的。

https:/github.comdotnetwcfissues13。

https:/github.comdotnetwcfissues1257。

谢谢你

保罗

asp.net-core-2.0 soap-client custom-binding
1个回答
0
投票
Uri epUri = new Uri(_serviceUri);
CustomBinding binding = new CustomBinding();
SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;        
sbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
sbe.IncludeTimestamp = false;
sbe.SetKeyDerivation(true);
sbe.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy;
binding.Elements.Add(sbe);
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8));
binding.Elements.Add(new HttpsTransportBindingElement());
EndpointAddress endPoint = new EndpointAddress(epUri);
© www.soinside.com 2019 - 2024. All rights reserved.