我有一個WCF REST服務接受一個自定義的DataContract參數作爲JSON,可以是超類型或子類型。當我傳遞包含額外空白的JSON時,對象總是反序列化爲超類型。當我從JSON中刪除所有空白時,對象將作爲子類型進行反序列化。WCF JSON反序列化問題與空白
下面是一個例子:
[DataContract]
[KnownType(typeof(SubClass))]
public class SuperClass
{
[DataMember]
public string Message { get; set; }
}
[DataContract]
public class SubClass : SuperClass
{
[DataMember]
public string Extra { get; set; }
}
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke]
void LogMessage(SuperClass arg);
}
public class Service1 : IService1
{
public void LogMessage(SuperClass arg)
{
if (arg is SubClass)
{
Debug.WriteLine("SubClass");
}
else if (arg is SuperClass)
{
Debug.WriteLine("SuperClass");
}
}
}
如果我發送如下信息,該服務將打印SuperClass
:
POST http://localhost:5763/Service1.svc/LogMessage HTTP/1.1
User-Agent: Fiddler
Content-Type: text/json
Host: localhost:5763
Content-Length: 86
{ "__type":"SubClass:#WhitespaceTest", "Message":"Message", "Extra":"Extra" }
我得到同樣的結果,如果我「漂亮打印」的數據包作爲以便JSOn分成多行。然而,服務將打印如果我剝離空格如下:
POST http://localhost:5763/Service1.svc/LogMessage HTTP/1.1
User-Agent: Fiddler
Content-Type: text/json
Host: localhost:5763
Content-Length: 73
{"__type":"SubClass:#WhitespaceTest","Message":"Message","Extra":"Extra"}
我已經調試的System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.ToString()
輸出,並注意到從JSON生成的XML是2個分組之間不同:
<!-- First packet, deserializes to SuperClass -->
<root type="object">
<__type type="string">SubClass:#WhitespaceTest</__type>
<Message type="string">Message</Message>
<Extra type="string">Extra</Extra>
</root>
<!-- Second packet, deserializes to SubClass -->
<root type="object" __type="SubClass:#WhitespaceTest">
<Message type="string">Message</Message>
<Extra type="string">Extra</Extra>
</root>
所以,似乎空白混淆了JSON解串器。有誰知道爲什麼會發生這種情況,我能做些什麼呢?
謝謝。有沒有來自Microsoft的知識庫文章,這是一個錯誤? – Imran 2016-03-24 20:07:31