【问题标题】:WCF in .net core (TransportWithMessageCredential).net 核心中的 WCF (TransportWithMessageCredential)
【发布时间】:2017-08-08 11:51:09
【问题描述】:

当我尝试在 dotnet core 2.0 中创建与 WCF 客户端的连接时,我收到一个平台不受支持的错误:

System.PlatformNotSupportedException: 'The value 'TransportWithMessageCredential' is not supported in this context for the binding security property 'securityMode'.'

如果我删除 BasicHttpSecurityMode,我会收到一个参数异常: System.ArgumentException: '提供的 URI 方案 'https' 无效;预期为“http”。'

代码:

ChannelFactory<BlackBoxContract> factory = null;
BlackBoxContract serviceProxy = null;
Binding binding = null;

binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);

factory = new ChannelFactory<BlackBoxContract>(binding, new EndpointAddress("https:......."));;
serviceProxy = factory.CreateChannel();

任何人找到了解决方法,因为这可能在长期路线图上? https://github.com/dotnet/wcf/issues/8

【问题讨论】:

  • WCF 客户端代码能否进入面向 .NET Standard 的类库?然后您可以从 .NET Core 调用该库。这个SO answer 可能是相关的。
  • 您在使用 WCF 连接服务吗? marketplace.visualstudio.com/…
  • WCF 连接的服务给了我一个错误,出于同样的原因。不支持,错误信息只是略有不同..github.com/dotnet/wcf/issues/1274
  • @Boggin 我已经生成了服务,它的连接给出了错误。
  • 有人找到解决方案了吗?

标签: c# .net wcf asp.net-core .net-core


【解决方案1】:

最新的软件包已修复此问题。

  <ItemGroup>
    <PackageReference Include="System.ServiceModel.Duplex" Version="4.6.0" />
    <PackageReference Include="System.ServiceModel.Http" Version="4.6.0" />
    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.6.0" />
    <PackageReference Include="System.ServiceModel.Security" Version="4.6.0" />
  </ItemGroup>  

【讨论】:

  • 这个关键点救了我的命。我正在使用 4.4.0,但它从未奏效。使用 4.6.0 版本我已经解决了我的问题。此外,您可以在.net framework中使用单独的程序集,也可以在.net core中使用
  • 2020 年最佳答案
【解决方案2】:

实际上找到了一个有效的解决方法,您可以使用一个包: https://github.com/gravity00/SimpleSOAPClient

using SimpleSOAPClient;
using SimpleSOAPClient.Handlers;
using SimpleSOAPClient.Helpers;
using SimpleSOAPClient.Models;
using SimpleSOAPClient.Models.Headers;

...

_client = SoapClient.Prepare().WithHandler(new DelegatingSoapHandler());
_client.HttpClient.DefaultRequestHeaders.Clear();
_client.HttpClient.DefaultRequestHeaders.Add("SOAPAction", "Action...");

 var requestEnvelope = SoapEnvelope
     .Prepare()
     .Body(request)
     .WithHeaders(KnownHeader.Oasis.Security.UsernameTokenAndPasswordText(Username, Password));

var responseEnvelope = _client.Send(Url, "CanNotBeEmpty", requestEnvelope);

让它像这样工作,作为一种魅力......

【讨论】:

  • 什么是 "SOAPAction" 和 "Action..." 。不知道写什么!帮忙?
  • 这不是一个糟糕的 sln,但大多数肥皂服务将需要带有 xml 命名空间的主体编码。所以请记住这一点。
  • 原作者有一个变通方法来解决xml ns问题。经过 2 天的斗争,我现在已经可以开始工作了。
  • @IbrarMumtaz 你是如何解决命名空间问题的?
  • 对不起 - 不得不放弃它,最后 OP 的 sln 太脆弱了。无法使用 DataContractSerializer 可靠地反序列化 soap msg。
猜你喜欢
  • 2019-05-20
  • 2021-03-28
  • 2018-10-17
  • 1970-01-01
  • 2017-10-23
  • 2020-12-07
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多