공통 클래스에서 파생 된 클래스를 전달하고 있습니다. 역 직렬화 유효한 데이터를 전달 함에도 불구하고 허브는 TypeNameHandling을 존중하지 않으며 JSON의 $ type을 완전히 무시합니다. 내가 무엇을 시도하든 기본 클래스로 역 직렬화됩니다.
이벤트가 진행되어 허브로 보내는 JSON을 가져 와서 허브 코드에 문자열로 붙여 넣은 다음 JsonConvert.Deserialize를 사용하여 어떤 일이 발생하는지 확인하고 파생 개체로 올바르게 역 직렬화했습니다.
내 스타트 업에서는
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
};
이것이 실제로 사용되고 있는지 확실하지 않았기 때문에 테스트 JSON 변환기를 만들고 CanRead 속성에 디버그를 추가했습니다 (정적 false를 반환했습니다). 맞았 어. 이것은 또한 내 문자열 역 직렬화가 작동하도록 허용했습니다.
그렇다면 허브를 제외한 모든 것이 작동하는 것처럼 보이는 허브는 무엇을 다르게 하고 있습니까?
역 직렬화 유효한 데이터를 전달하더라도 허브는 TypeNameHandling을 존중하지 않으며 JSON의 $ type을 완전히 무시합니다. 내가 무엇을 시도하든 기본 클래스로 역 직렬화됩니다.
나는 나를 위해 작동하는 다음 코드 스 니펫으로 테스트를 수행했습니다. 참조 할 수 있습니다.
시작시 :
services.AddSignalR().AddJsonProtocol(options => {
options.PayloadSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
{
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
};
});
허브 방법 :
public async Task SendMessage1(Business mes)
{
//code logic here
//...
}
클래스:
public abstract class Business
{
public string Name { get; set; }
}
public class Hotel : Business
{
public int Stars { get; set; }
}
클라이언트에서 다음 JSON 데이터를 위의 허브 메서드로 보냅니다.
var ht = { "$type": "MyNamespaceHere.Hotel, NotesRTMSignalR", "Stars": 4, "Name": "Hudson Hotel" };
검사 결과:
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다