我刚开始编写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));
}
}
}
答案 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));
}
}