【问题标题】:Operation parameters not populated未填充操作参数
【发布时间】:2013-01-28 06:55:00
【问题描述】:

我有一个具有以下服务\操作\数据合同的 WCF 服务。

namespace Enrollment
{    
    [ServiceContract(Namespace = "http://docs.oasis-open.org/ws-sx/ws-trust/200512")]
    public interface wstep
    {
        [OperationContract(Action = "http://schemas.microsoft.com/windows/pki/2009/01/enrollment/RST/wstep", Name = "RequestSecurityToken")]
        RequestSecurityTokenResponseCollection RequestSecurityToken(string TokenType, string RequestType, BinarySecurityToken binarySecurityToken, AdditionalContext additionalContext);
    }

    [DataContract(Namespace = "http://schemas.xmlsoap.org/ws/2006/12/authorization")]
    public class AdditionalContext
    {
        [DataMember]
        public List<ContextItem> contextItem { get; set; }
    }

    [DataContract(Namespace = "http://schemas.xmlsoap.org/ws/2006/12/authorization")]
    public class ContextItem
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember(Name="Value")]
        public object Item { get; set; }
    }

    [XmlRoot("BinarySecurityToken")]
    [DataContract(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", Name = "BinarySecurityToken")]
    public class BinarySecurityToken
    {
        [XmlAttribute("ValueType")]
        [DataMember(Name = "ValueType",Order=1)]        
        public string ValueType { get; set; }

        [XmlAttribute("EncodingType")]
        [DataMember(Name = "EncodingType", Order = 2)]
        public string EncodingType { get; set; }
    }
}

但是,当我在服务中检查它们的值时,我看到客户端连接到服务,但操作的最后两个参数 - BinarySecurityToken 和 AdditionalContext 为空。我已经跟踪了客户端请求,并且我看到客户端正确发送了这些值。下面提到的是SOAP体。

<s:Body>
    <wst:RequestSecurityToken>
        <wst:TokenType>http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken</wst:TokenType>
        <wst:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</wst:RequestType>
        <wsse:BinarySecurityToken ValueType="http://schemas.microsoft.com/windows/pki/2009/01/enrollment#PKCS10" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#base64binary">MIICcTCCAV0CAQAwMDEuMCwGA1UEAxMlQj=</wsse:BinarySecurityToken>
        <ac:AdditionalContext xmlns="http://schemas.xmlsoap.org/ws/2006/12/authorization">
            <ac:ContextItem Name="DeviceType">
                <ac:Value>MyDevice</ac:Value>
            </ac:ContextItem>
            <ac:ContextItem Name="ApplicationVersion">
                <ac:Value>18.10.6603.101</ac:Value>
            </ac:ContextItem>
        </ac:AdditionalContext>
    </wst:RequestSecurityToken>
</s:Body>

前两个参数显示正确。不知道发生了什么。

【问题讨论】:

    标签: c# .net wcf wsdl wcf-security


    【解决方案1】:

    您不能通过 WCF 发送 object 类型的实例。您需要使用ServiceKnownType 属性声明将通过服务发送的类型。

    [DataMember(Name="Value")]
    public object Item { get; set; }
    

    例如,如果你知道object只能是X类的一个实例,那么;

    [ServiceKnownType(typeof(x))]
    public interface wstep
    

    另外,如果想改变序列化xml的结构,参考下面data contract serialization vs xml serialization

    【讨论】:

    • 我将其更改为返回类型字符串 - 但这也不起作用!
    • 您正在尝试更改发送的 xml 的结构;您需要更改序列化机制。请参考我提供的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2016-07-18
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多