2014-05-08 22 views
3

我的服務調用不起作用,並且因爲類型提示沒有在消息中發送。WCF不在消息中發送類型提示

以下是發送內容。

<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一個問題,但我不知道。

回答

0

想通了。對於有同樣問題的任何人,這是什麼造成了差異。

我的服務接口被設置爲採取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類型。