我的服务呼叫无法正常工作,因为没有在消息中一起发送类型提示。

这就是发送的内容。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <createLocalUser xmlns="http://adobe.com/idp/services">
            <localUser xmlns:i="http://www.w3.org/2001/XMLSchema-instance">


这就是应该的

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <createLocalUser xmlns="http://adobe.com/idp/services">
            <localUser i:type="UserImpl">


注意localUser元素上的更改。我知道这是问题所在,因为如果我在提琴手中修改请求,它就会起作用。我只是不知道要在C#代码中进行哪些更改。

这是我的C#类。

[DataContract(Name = "UserImpl", Namespace = NameSpace.Root)]
public partial class UserImpl : User { }

[DataContract(Name = "User", Namespace = NameSpace.Root)]
public partial class User : Principal { ... }

[DataContract(Name = "Principal", Namespace = NameSpace.Root)]
public partial class Principal { ... }


和界面

[ServiceContract(Namespace = NameSpace.Root)]
public interface IDirectoryManagementService
{
    [OperationContract(Name = "createLocalUser")]
    string CreateLocalUser(DataContracts.UserImpl localUser, string password);


我认为ServiceKnownType或KnownType存在问题,但是我不确定。

最佳答案

明白了。对于任何有相同问题的人,这就是与众不同的原因。

我的服务接口设置为采用UserImpl对象

string CreateLocalUser(DataContracts.UserImpl localUser, string password);


我通过了一个UserImpl实例。但是,我需要做的是将其更改为User。由于UserImpl继承自User,因此C#没有任何问题,但是WCF注意到了区别,并添加了i:type属性。所以这也是我更改的内容。

[ServiceContract(Namespace = NameSpace.Root)]
    public interface IDirectoryManagementService
    {
        [OperationContract(Name = "createLocalUser")]
        string CreateLocalUser(DataContracts.User localUser, string password);


注意localUser参数现在是User类型。

10-07 19:24
查看更多