WCF没有在消息中发送类型提示

本文关键字:类型 提示 消息 WCF | 更新日期: 2023-09-27 18:02:18

我的服务调用不工作,这是因为没有在消息中发送类型提示。

这是正在发送的内容。

<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元素上的更改。我知道这是问题所在,因为如果我在fiddler中修改请求,它就能工作。我只是不知道在我的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的问题,但我不确定。

WCF没有在消息中发送类型提示

明白了。对于任何有同样问题的人来说,这是造成差异的原因。

我的服务接口被设置为接受一个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类型