2

我正在尝试使用 WCF/C# 客户端使用肥皂网络服务。

服务器的 wsdl 在其 wsdl 文件中定义其安全策略,如下所示:

<wsp:Policy wsu:Id="BindingSecPolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:AsymmetricBinding>
     ...

绑定定义中引用了此策略。

现在我正在尝试在 WCF 中设置一个可以与该服务通信的客户端。我创建了一个新的 .NET 4.5 控制台应用程序,添加了一个服务引用,让 Visual Studio 为我的服务自动生成类。

这就是我试图调用我的服务的方式。

WSDualHttpBinding binding = new WSDualHttpBinding();
binding.Security.Mode = WSDualHttpSecurityMode.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
binding.Security.Message.NegotiateServiceCredential = false;
binding.ClientBaseAddress = new Uri("http://localhost:5555");
EndpointAddress address = new EndpointAddress("http://localhost:9080/CustomerServicePort");
CustomerServiceClient client = new CustomerServiceClient(binding, address);
foreach (customer c in client.getCustomersByName("foo")) {
    Console.WriteLine(c);
}
client.Close();
Console.ReadKey();

我使用双重绑定的原因是 wsdl 还将 WS-RM 定义为一项要求。我知道我目前没有指定任何证书,所以这个设置不能真正起作用。当我运行此代码时,我收到一个异常,指出该策略不受支持:

Warning 1   Custom tool warning: Cannot import wsdl:binding
Detail: An exception was thrown in a call to a policy import extension.
Extension: System.ServiceModel.Channels.SecurityBindingElementImporter
Error: An unsupported security policy assertion was detected during the security policy import: <sp:AsymmetricBinding xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
    <sp:InitiatorToken>
        <wsp:Policy>
            <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                <wsp:Policy>
                    <sp:RequireThumbprintReference />
                    <sp:WssX509V3Token10 />
                </wsp:Policy>
            </sp:X509Token>
        </wsp:Policy>
    </sp:InitiatorToken>
    <sp:RecipientToken>
        <wsp:Policy>
            <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/I...

XPath to Error Source: //wsdl:definitions[@targetNamespace='http://customerservice.example.com']/wsdl:binding[@name='CustomerServiceServiceSoapBinding']    C:\projects\cxf-samples\wsrm-client-csharp\ConsoleApplication1\ConsoleApplication1\Service References\CustomerService\Reference.svcmap  1   1   b2bclientcsharp

这是在实际检查我是否提供证书之前发生的,所以我还没有费心设置它。根据 Microsoft 的文档,支持 WS-SecurityPolicy 1.2,他们甚至给出了一个与服务定义的策略非常相似的示例策略。

请参阅http://msdn.microsoft.com/en-us/library/aa738565.aspx并搜索“使用 X.509 证书进行服务身份验证”。

任何一般的想法我在这里做错了什么?

干杯,安迪

4

0 回答 0