简体   繁体   English

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

[英]Asp.Net Core 2.0 WCF Client CustomBinding PlatformNotSupportedException: BuildChannelFactoryCore is not supported

I need to be able to send authorization in my Client using custom bindings in Asp.Net Core 2.0.我需要能够使用 Asp.Net Core 2.0 中的自定义绑定在我的客户端中发送授权。 It works in Asp.net 4.6.1 and doesn't work in Core 2.2.它适用于 Asp.net 4.6.1,不适用于 Core 2.2。 I am trying to connect to a Workday Public Web Service in our Tenant.我正在尝试连接到我们租户中的 Workday 公共 Web 服务。 Since I was able to make this work in Asp.Net 4.6.1, I completed my development there, but would like to figure this out for possible future development.因为我能够在 Asp.Net 4.6.1 中完成这项工作,所以我在那里完成了我的开发,但想弄清楚这一点,以便将来可能进行开发。

I created the custom bindings that I used in code.我创建了在代码中使用的自定义绑定。 see below, however, I always get this error: Full Message:但是,请参见下文,我总是收到此错误:完整消息:

System.PlatformNotSupportedException : TransportSecurityBindingElement.BuildChannelFactoryCore is not supported. System.PlatformNotSupportedException :不支持 TransportSecurityBindingElement.BuildChannelFactoryCore。

My implementation in Asp.Net Core 2.0 MVC:我在 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;
       }

Expected it to give me a response, since I was able to make it work in Asp.Net in a web.config setting:期望它给我一个回应,因为我能够在 web.config 设置中让它在 Asp.Net 中工作:

  <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>

I don't think that I implemented it incorrectly, but need to know if I missed something or if the BuildChannelFactoryCore is still not supported, then when will it be?我认为我没有错误地实现它,但需要知道我是否遗漏了什么或者 BuildChannelFactoryCore 仍然不受支持,那么什么时候会呢?

Reference blogs where this is mentioned:提到这一点的参考博客:

https://github.com/dotnet/wcf/issues/13 https://github.com/dotnet/wcf/issues/13

https://github.com/dotnet/wcf/issues/1257 https://github.com/dotnet/wcf/issues/1257

Thanks,谢谢,

Paul保罗

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM