2010-09-20 58 views
1

考虑下面的代码..如何传递到对象网络服务和消费该web服务

[Serializable] 
public class Student 
{ 
    private string studentName; 
    private double gpa; 

    public Student() 
    { 

    } 

    public string StudentName 
    { 
     get{return this.studentName;} 
     set { this.studentName = value; } 
    } 

    public double GPA 
    { 
     get { return this.gpa; } 
     set { this.gpa = value; } 
    } 


} 

私人的ArrayList studentList =新的ArrayList();

[WebMethod] 
    public void AddStudent(Student student) 
    { 
     studentList.Add(student); 
    } 

    [WebMethod] 
    public ArrayList GetStudent() 
    { 
     return studentList; 
    } 

我想使用简单的C#客户端表单应用程序使用该Web服务。 我无法使用以下代码段获取学生列表。

MyServiceRef.Student student = new Consuming_WS.MyServiceRef.Student();

MyServiceRef.Service1SoapClient client = new Consuming_WS.MyServiceRef.Service1SoapClient(); 

任何想法.. ??

预先感谢!

+0

,能得到任何的异常/错误?您没有调用Web服务的GetStudent()方法。如果我们从Web服务返回C#ArrayList,我们是否可以真正从其他平台的客户端使用相同的ArrayList?说Java客户端? – Shekhar 2010-09-20 09:15:11

+0

是的,我知道..但事情是我不能指定这样的东西.. ArrayList studentList = new ArrayList(); studentList = client.GetStudent();此代码段不起作用!任何想法..? – smartcode 2010-09-20 10:34:35

回答

0

问题是您的Web服务不是无状态的。每次调用Web服务时,都将实例化Web服务类的新实例,并在该实例上调用该方法。当实例被调用时,studentList被分配一个新的空列表。

你需要改变你的状态管理。例如。

private static ArrayList studentList = new ArrayList(); 

可能会工作得更好,但它仍然不可靠。 请查阅http://www.beansoftware.com/asp.net-tutorials/managing-state-web-service.aspx的文章获取存储Session(或Application)中状态的示例。

编辑:添加示例代码以避免使用ArrayList。

为了避免与ArrayList和ArrayOfAnyType问题:

private List<Student> studentList = new List<Student>(); 

[WebMethod] 
public void AddStudent(Student student) 
{ 
    studentList.Add(student); 
} 

[WebMethod] 
public Student[] GetStudent() 
{ 
    return studentList.ToArray(); 
} 
+0

:: Nop ..问题仍然存在。它说..“不能隐式转换类型'Consuming_WS.MyServiceRef.ArrayOfAnyType'到'System.Collections.ArrayList'”......任何想法.. ?? – smartcode 2010-09-24 12:30:25

+0

请参阅我上面添加的示例以解决此问题。问题是您在Web服务界面中使用ArrayList。 – 2010-09-24 13:42:56