C#.NET WebService 返回对象

3
我正在使用ASP.NET C#创建Web服务。我从WebService发送各种数据类型,因此我使用以下结构。
public enum WS_ServiceResponseResult
{
    Success,
    Failure,
}
public class WS_ServiceResponse
{
    public WS_ServiceResponseResult result { get; set; }
    public object data { get; set; }
}

public class WS_User
{
    public long id{ get; set; }
    public string name{ get; set; }
}

Web服务示例方法

    [WebMethod(EnableSession = true)]
    public WS_ServiceResponse LogIn(string username, string pasword)
    {
        WS_ServiceResponse osr = new WS_ServiceResponse();
        long userID = UserController.checkLogin(username, pasword);

        if (userID != 0)
        {
            osr.result = WS_ServiceResponseResult.Success;
            osr.data = new WS_User() { id = userID, name = username };
        }
        else
        {
            osr.result = WS_ServiceResponseResult.Failure;
            osr.data = "Invalid username/password!";
        }
        return osr;
    }

我使用两种客户端类型,JavaScript 和 C#.NET Windows Form。当我从 JavaScript 调用时,没有问题,osr.data 填充了 WS_User。因此,我可以轻松地使用 osr.data.id。但是当我从 C#.NET 调用时(代理使用“添加 Web 引用”生成),我可以成功调用,但当结果到达时,我会收到一个 Soap 异常。
{System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: 服务器无法处理请求。 ---> System.InvalidOperationException: 生成 XML 文档时出错 ... ... }
我错过了什么?我猜对象定义不正确,导致问题。有哪些解决方法?
谢谢。
Maksud
补充:
如果添加以下虚拟方法,则它可以正常工作。希望能帮助您找到解决方案。
    [WebMethod]
    public WS_User Dummy()
    {
        return new WS_User();
    }

你是否为C#生成代理客户端? - Arsen Mkrtchyan
是的,我使用了“添加Web引用”来完成这个操作。如果我返回osr.data =“abcd”; //即对象是数据,那么我就不会得到异常。我得到的结果是成功和数据为“abcd”。但是如果我使用WS_User对象,那么我就会遇到麻烦。 - max
1个回答

5

我曾遇到过类似的问题,需要返回一个“对象”(可能有多个类)。 以下是示例代码:

[Serializable()]
[XmlRoot(ElementName="Object")]
public sealed class XMLObject
{

    private Object _Object;

    [XmlElement(Type=typeof(App.Projekte.Projekt), ElementName="Projekt")]
    [XmlElement(Type=typeof(App.Projekte.Task), ElementName="Task")]
    [XmlElement(Type=typeof(App.Projekte.Mitarbeiter), ElementName="Mitarbeiter")]
    public Object Object
    {
        get
        {
            return _Object;
        }
        set
        {
            _Object = value;
        }
    }
}

我认为你应该这样修改你的代码:
[XmlRoot(ElementName="ServiceResponse")]
public class WS_ServiceResponse
{
    public WS_ServiceResponseResult result { get; set; }

    [XmlElement(Type=typeof(WS_User), ElementName="WS_User")]
    [XmlElement(Type=typeof(string), ElementName="Text")]
    public object data { get; set; }
}

你的解决方案完美地运作了。如果我需要一些数组,那么[XmlElement(Type=typeof(WS_User[]), ElementName="WS_User[]")]也可以工作。哇。 - max
我们需要改变 "public object data { get; set; }" 吗? - Brian
虽然这个解决方案可行,但我的担忧是,随着更多的原始类型和引用类型使用此对象,您将不得不手动添加 XmlElement 属性。有没有更简洁的方法? - Josh Monreal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接