ASMX JSON WebService,更改属性类型并具有旧的__type - 错误

时间:2011-08-29 20:36:56

标签: c# web-services json asmx

我有一个.NET JSON Web服务

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
[GenerateScriptType(typeof(Item))]
[GenerateScriptType(typeof(Info))]
[GenerateScriptType(typeof(Details))]
public class API : System.Web.Services.WebService
{
    [WebMethod]
    public Item[] GetItems()
    {
         ...
    }

    [WebMethod]
    public bool SaveItem(Item item)
    {
         ...
    }
}

类的定义位于消息的底部。

More类中有Info类型的媒体资源Item

在客户端(HTML5)我正在呼叫GetItems(),并将其存储在本地存储中,并定期拨打SaveItem

我在客户端上获得的JSON数据类似于:

[{"__type":"MyApp.API.Item","More":{"__type":"MyApp.API.Info","ID":1}}]

到目前为止一切都很好。

当我将属性More从类型Info更改为Details类中的Item类型时,会出现问题,例如:

[Serializable]
public class Item 
{
    public Details More { get; set; } // <----- type changed from Info to Details
}

由于我的客户端已缓存数据,因此当我尝试调用SaveItem时,ASP.NET会抛出错误:

 Cannot convert object of type 'MyApp.API.Info' to 'MyApp.API.Details'

问题:如果有解决方案(理想情况下保留ASMX Web服务,而不是更改客户端上的JSON数据)?

以下是这些课程的内容:

[Serializable]
public class Item 
{
    public Info More { get; set; }
}

[Serializable]
public class Details: Info, IDetails
{
    public string Notes { get; set; }
}

[Serializable]
public class Info: IInfo
{
    public int ID { get; set; }
}

public interface IDetails: IInfo
{
    string Notes { get; }
}

public interface IInfo
{
    int ID { get; }
}

1 个答案:

答案 0 :(得分:0)

如果您不想看到“类型”:“对象”,则可以将方法设为object类型。 所有这些文本都应该消失。