【问题标题】:Easy WCF program, service method not working in client program简单的 WCF 程序,服务方法在客户端程序中不起作用
【发布时间】:2016-04-24 15:33:54
【问题描述】:

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

这是客户端代码:

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));

    }

    }
}

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

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

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

    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&lt;T&gt; 类不是线程安全的。这意味着如果您有多个并发客户端调用您的 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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多