WCF在.NET Core中的使用(TransportWithMessageCredential)

6

当我尝试在.NET 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答案可能与此相关。 - Boggin
你是否正在使用WCF连接服务?https://marketplace.visualstudio.com/items?itemName=WCFCORETEAM.VisualStudioWCFConnectedService - Tseng
WCF连接服务在某处出现了相同的错误,提示不支持,但错误信息略有不同。请参考https://github.com/dotnet/wcf/issues/1274。 - Jelle Oosterbosch
@Boggin,我已经生成了服务,但连接出现了错误。 - Jelle Oosterbosch
有人找到解决方案了吗? - hugo
2个回答

13

最新的软件包已经解决了这个问题。

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

3
这个关键点救了我的命。我一直在使用4.4.0版本,但它从未正常工作过。通过升级到4.6.0版本,我解决了问题。此外,在.NET Framework中可以使用独立的程序集,并在.NET Core中使用它们。 - uzay95
2020年最佳答案 - Flacid_Snake

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”是什么东西?我不知道该写什么!能帮忙吗? - Murat
1
这不是一个坏的解决方案,但大多数SOAP服务将需要使用带有XML命名空间的正文编码。所以请记住这一点。 - IbrarMumtaz
原始作者已经有一个解决XML命名空间问题的方法。经过两天的奋斗,我现在已经成功地让一些东西工作了。 - IbrarMumtaz
@IbrarMumtaz,你是如何解决命名空间问题的? - Yahya Hussein
抱歉,不得不放弃它,最终 OP 的解决方案太不可靠了。使用 DataContractSerializer 无法可靠地反序列化 SOAP 消息。 - IbrarMumtaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接