简易WCF程序,服务方法在客户端程序中不起作用

时间:2016-04-24 07:32:08

标签: c# wcf

我刚开始编写WCF服务并遇到了一个奇怪的问题。我不知道为什么客户端调用服务的方法不能正常工作,也不会创建新书。 listBooks()方法id ok,因为它返回书籍列表,但方法addBook不会在booksList中创建新书。但是这种情况只有在我从客户端使用此方法时才会使用,因为在Service构造函数中调用的相同方法会创建一本书。

以下是客户端代码:

namespace LibraryClient
{
class Program
{
    static ServiceReference.ServiceClient client;
    static void Main(string[] args)
    {

        client = new ServiceReference.ServiceClient();

        client.addBook(2, "some book", "some author"); //this is not working
        ServiceReference.Book[] books = client.listBooks();

        foreach(var book in books)
        {
            Console.WriteLine("{0}", book.title);
        }

        Console.ReadLine();

    }
}
}

和服务代码:

namespace LibraryService
{

public class Service : IService
{

    private static List<Book> booksList;
    private static List<User> usersList;



    public Service()
    {
        booksList = new List<Book>();
        usersList = new List<User>();
        addBook(1, "ANOTHER BOOK", "ANOTHER AUTHOR"); //this is working


    }

    public List<Book> listBooks()
    {

        return booksList;
    }

    public List<User> listUsers() { 
        return usersList;
    }

    public void addBook(int id, string title, string author)
    {
        booksList.Add(new Book(id,title,author));

    }

    }
}

1 个答案:

答案 0 :(得分:4)

在服务器端,每次调用服务时都会创建一个新的服务类实例。并且创建一个新实例意味着将调用此类的构造函数。

看看你在构造函数中做了什么:

booksList = new List<Book>();
usersList = new List<User>();

基本上,你要杀死以前调用中可能存储在那些静态列表中的所有内容。因此,请确保仅对这些列表进行一次实例化,以确保存储在其中的信息在多次调用之间保持不变:

private static readonly List<Book> booksList = new List<Book>();
private static readonly List<User> usersList = new List<User>();

public Service()
{
}

还要记住List<T>类不是线程安全的。这意味着如果您对Web服务有多个并发客户端调用,则此列表中的数据可能已损坏。您可能需要同步对它们的访问以防止这种情况:

private static readonly object syncRoot = new object();

public void addBook(int id, string title, string author)
{
    lock (syncRoot)
    {
        booksList.Add(new Book(id, title, author));
    }
}